From 9f6d40d0d1ff15a0051c4e1db7b3c432f7c2b7e9 Mon Sep 17 00:00:00 2001 From: takuma-hmng8 Date: Mon, 13 May 2024 14:04:06 +0900 Subject: [PATCH 1/3] updateDependencies --- app/_home/Playground.tsx | 2 +- app/bananaStickers/Playground.tsx | 73 + app/bananaStickers/page.tsx | 19 + app/bananaStickers/useStickers.ts | 121 + package-lock.json | 64 +- package.json | 8 +- packages/use-shader-fx/build/use-shader-fx.js | 4727 ----------------- .../use-shader-fx/build/use-shader-fx.js.map | 1 - .../use-shader-fx/build/use-shader-fx.umd.cjs | 1571 ------ .../build/use-shader-fx.umd.cjs.map | 1 - packages/use-shader-fx/package-lock.json | 50 +- packages/use-shader-fx/package.json | 4 +- .../types/fxs/3D/types/index.d.ts | 10 - .../types/fxs/3D/useMorphParticles/index.d.ts | 66 - .../useCreateMorphParticles.d.ts | 29 - .../utils/modifyAttributes.d.ts | 5 - .../utils/rewriteFragmentShader.d.ts | 5 - .../utils/rewriteVertexShader.d.ts | 2 - .../utils/useCreateObject.d.ts | 13 - .../useMorphParticles/utils/useMaterial.d.ts | 124 - .../types/fxs/3D/useWobble3D/index.d.ts | 56 - .../fxs/3D/useWobble3D/useCreateWobble3D.d.ts | 20 - .../types/fxs/3D/useWobble3D/useMaterial.d.ts | 91 - .../fxs/effects/useMotionBlur/index.d.ts | 27 - .../fxs/effects/useMotionBlur/useMesh.d.ts | 27 - .../fxs/effects/useSimpleBlur/index.d.ts | 25 - .../fxs/effects/useSimpleBlur/useMesh.d.ts | 21 - .../types/fxs/effects/useWave/index.d.ts | 28 - .../types/fxs/effects/useWave/useMesh.d.ts | 27 - .../fxs/interactions/useBrush/index.d.ts | 44 - .../fxs/interactions/useBrush/useMesh.d.ts | 72 - .../types/fxs/misc/useBlank/index.d.ts | 30 - .../types/fxs/misc/useBlank/useMesh.d.ts | 30 - .../types/fxs/misc/useChromaKey/index.d.ts | 36 - .../types/fxs/misc/useChromaKey/useMesh.d.ts | 45 - .../fxs/noises/useColorStrata/index.d.ts | 40 - .../fxs/noises/useColorStrata/useMesh.d.ts | 51 - .../types/fxs/noises/useCosPalette/index.d.ts | 30 - .../fxs/noises/useCosPalette/useMesh.d.ts | 30 - .../types/fxs/noises/useMarble/index.d.ts | 32 - .../types/fxs/noises/useMarble/useMesh.d.ts | 33 - .../types/fxs/noises/useNoise/index.d.ts | 36 - .../types/fxs/noises/useNoise/useMesh.d.ts | 36 - .../types/fxs/simulations/useFluid/index.d.ts | 59 - .../materials/useAdvectionMaterial.d.ts | 22 - .../useFluid/materials/useClearMaterial.d.ts | 16 - .../useFluid/materials/useCurlMaterial.d.ts | 13 - .../materials/useDivergenceMaterial.d.ts | 13 - .../useGradientSubtractMaterial.d.ts | 16 - .../materials/useInitialMaterial.d.ts | 2 - .../materials/usePressureMaterial.d.ts | 16 - .../useFluid/materials/useSplatMaterial.d.ts | 25 - .../materials/useVorticityMaterial.d.ts | 22 - .../fxs/simulations/useFluid/useMesh.d.ts | 53 - .../fxs/simulations/useRipple/index.d.ts | 39 - .../fxs/simulations/useRipple/useMesh.d.ts | 10 - .../use-shader-fx/types/fxs/types/index.d.ts | 57 - .../fxs/utils/useAlphaBlending/index.d.ts | 22 - .../fxs/utils/useAlphaBlending/useMesh.d.ts | 20 - .../types/fxs/utils/useBlending/index.d.ts | 36 - .../types/fxs/utils/useBlending/useMesh.d.ts | 42 - .../fxs/utils/useBrightnessPicker/index.d.ts | 26 - .../utils/useBrightnessPicker/useMesh.d.ts | 24 - .../fxs/utils/useCoverTexture/index.d.ts | 20 - .../fxs/utils/useCoverTexture/useMesh.d.ts | 24 - .../types/fxs/utils/useDuoTone/index.d.ts | 25 - .../types/fxs/utils/useDuoTone/useMesh.d.ts | 21 - .../types/fxs/utils/useFxBlending/index.d.ts | 25 - .../fxs/utils/useFxBlending/useMesh.d.ts | 21 - .../types/fxs/utils/useFxTexture/index.d.ts | 36 - .../types/fxs/utils/useFxTexture/useMesh.d.ts | 51 - .../types/fxs/utils/useHSV/index.d.ts | 24 - .../types/fxs/utils/useHSV/useMesh.d.ts | 23 - packages/use-shader-fx/types/index.d.ts | 37 - .../use-shader-fx/types/libs/constants.d.ts | 8 - packages/use-shader-fx/types/libs/easing.d.ts | 9 - .../types/libs/shaders/resolveShaders.d.ts | 2 - .../use-shader-fx/types/misc/useBeat.d.ts | 14 - .../types/misc/useCopyTexture.d.ts | 17 - .../types/misc/useDomSyncer/index.d.ts | 45 - .../misc/useDomSyncer/utils/createMesh.d.ts | 25 - .../useDomSyncer/utils/createUseDomView.d.ts | 6 - .../misc/useDomSyncer/utils/errorHandler.d.ts | 2 - .../utils/useIntersectionHandler.d.ts | 6 - .../useDomSyncer/utils/useIsIntersecting.d.ts | 7 - .../useDomSyncer/utils/useUpdateDomRect.d.ts | 16 - .../types/misc/useFPSLimiter.d.ts | 14 - .../use-shader-fx/types/misc/usePointer.d.ts | 16 - .../use-shader-fx/types/utils/getDpr.d.ts | 5 - .../types/utils/setOnBeforeCompile.d.ts | 3 - .../types/utils/setUniforms.d.ts | 16 - .../use-shader-fx/types/utils/useAddMesh.d.ts | 3 - .../types/utils/useAddObject.d.ts | 7 - .../use-shader-fx/types/utils/useCamera.d.ts | 3 - .../types/utils/useDoubleFBO.d.ts | 26 - .../use-shader-fx/types/utils/useParams.d.ts | 7 - .../types/utils/useResolution.d.ts | 6 - .../types/utils/useSingleFBO.d.ts | 39 - 98 files changed, 274 insertions(+), 8630 deletions(-) create mode 100644 app/bananaStickers/Playground.tsx create mode 100644 app/bananaStickers/page.tsx create mode 100644 app/bananaStickers/useStickers.ts delete mode 100644 packages/use-shader-fx/build/use-shader-fx.js delete mode 100644 packages/use-shader-fx/build/use-shader-fx.js.map delete mode 100644 packages/use-shader-fx/build/use-shader-fx.umd.cjs delete mode 100644 packages/use-shader-fx/build/use-shader-fx.umd.cjs.map delete mode 100644 packages/use-shader-fx/types/fxs/3D/types/index.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/3D/useMorphParticles/index.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/3D/useMorphParticles/useCreateMorphParticles.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/modifyAttributes.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/rewriteFragmentShader.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/rewriteVertexShader.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/useCreateObject.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/useMaterial.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/3D/useWobble3D/index.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/3D/useWobble3D/useCreateWobble3D.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/3D/useWobble3D/useMaterial.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/effects/useMotionBlur/index.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/effects/useMotionBlur/useMesh.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/effects/useSimpleBlur/index.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/effects/useSimpleBlur/useMesh.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/effects/useWave/index.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/effects/useWave/useMesh.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/interactions/useBrush/index.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/interactions/useBrush/useMesh.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/misc/useBlank/index.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/misc/useBlank/useMesh.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/misc/useChromaKey/index.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/misc/useChromaKey/useMesh.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/noises/useColorStrata/index.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/noises/useColorStrata/useMesh.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/noises/useCosPalette/index.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/noises/useCosPalette/useMesh.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/noises/useMarble/index.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/noises/useMarble/useMesh.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/noises/useNoise/index.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/noises/useNoise/useMesh.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/simulations/useFluid/index.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useAdvectionMaterial.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useClearMaterial.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useCurlMaterial.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useDivergenceMaterial.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useGradientSubtractMaterial.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useInitialMaterial.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/simulations/useFluid/materials/usePressureMaterial.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useSplatMaterial.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useVorticityMaterial.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/simulations/useFluid/useMesh.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/simulations/useRipple/index.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/simulations/useRipple/useMesh.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/types/index.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/utils/useAlphaBlending/index.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/utils/useAlphaBlending/useMesh.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/utils/useBlending/index.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/utils/useBlending/useMesh.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/utils/useBrightnessPicker/index.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/utils/useBrightnessPicker/useMesh.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/utils/useCoverTexture/index.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/utils/useCoverTexture/useMesh.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/utils/useDuoTone/index.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/utils/useDuoTone/useMesh.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/utils/useFxBlending/index.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/utils/useFxBlending/useMesh.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/utils/useFxTexture/index.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/utils/useFxTexture/useMesh.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/utils/useHSV/index.d.ts delete mode 100644 packages/use-shader-fx/types/fxs/utils/useHSV/useMesh.d.ts delete mode 100644 packages/use-shader-fx/types/index.d.ts delete mode 100644 packages/use-shader-fx/types/libs/constants.d.ts delete mode 100644 packages/use-shader-fx/types/libs/easing.d.ts delete mode 100644 packages/use-shader-fx/types/libs/shaders/resolveShaders.d.ts delete mode 100644 packages/use-shader-fx/types/misc/useBeat.d.ts delete mode 100644 packages/use-shader-fx/types/misc/useCopyTexture.d.ts delete mode 100644 packages/use-shader-fx/types/misc/useDomSyncer/index.d.ts delete mode 100644 packages/use-shader-fx/types/misc/useDomSyncer/utils/createMesh.d.ts delete mode 100644 packages/use-shader-fx/types/misc/useDomSyncer/utils/createUseDomView.d.ts delete mode 100644 packages/use-shader-fx/types/misc/useDomSyncer/utils/errorHandler.d.ts delete mode 100644 packages/use-shader-fx/types/misc/useDomSyncer/utils/useIntersectionHandler.d.ts delete mode 100644 packages/use-shader-fx/types/misc/useDomSyncer/utils/useIsIntersecting.d.ts delete mode 100644 packages/use-shader-fx/types/misc/useDomSyncer/utils/useUpdateDomRect.d.ts delete mode 100644 packages/use-shader-fx/types/misc/useFPSLimiter.d.ts delete mode 100644 packages/use-shader-fx/types/misc/usePointer.d.ts delete mode 100644 packages/use-shader-fx/types/utils/getDpr.d.ts delete mode 100644 packages/use-shader-fx/types/utils/setOnBeforeCompile.d.ts delete mode 100644 packages/use-shader-fx/types/utils/setUniforms.d.ts delete mode 100644 packages/use-shader-fx/types/utils/useAddMesh.d.ts delete mode 100644 packages/use-shader-fx/types/utils/useAddObject.d.ts delete mode 100644 packages/use-shader-fx/types/utils/useCamera.d.ts delete mode 100644 packages/use-shader-fx/types/utils/useDoubleFBO.d.ts delete mode 100644 packages/use-shader-fx/types/utils/useParams.d.ts delete mode 100644 packages/use-shader-fx/types/utils/useResolution.d.ts delete mode 100644 packages/use-shader-fx/types/utils/useSingleFBO.d.ts diff --git a/app/_home/Playground.tsx b/app/_home/Playground.tsx index 613d19a6..f689d1a9 100644 --- a/app/_home/Playground.tsx +++ b/app/_home/Playground.tsx @@ -112,7 +112,7 @@ export const Playground = ({ }), [hsv, marble] ), - onBeforeCompile: useCallback((shader: THREE.Shader) => { + onBeforeCompile: useCallback((shader: any) => { shader.fragmentShader = shader.fragmentShader.replace( "#usf ", ` diff --git a/app/bananaStickers/Playground.tsx b/app/bananaStickers/Playground.tsx new file mode 100644 index 00000000..bb92846d --- /dev/null +++ b/app/bananaStickers/Playground.tsx @@ -0,0 +1,73 @@ +"use client"; + +import { Environment } from "@react-three/drei"; +import { useStickers } from "./useStickers"; + +export const Playground = () => { + const { sticker, setStickerState } = useStickers(); + + return ( + { + setStickerState(e.uv!); + }}> + + + { + // //mapのalphaをfloat変数に格納; + // shader.fragmentShader = shader.fragmentShader.replace( + // "#include ", + // ` + // #include + // float customMapAlpha = sampledDiffuseColor.a; + // ` + // ); + // // iridescenceにmapのalphaをかける(mapだけiridescenceする) + // shader.fragmentShader = shader.fragmentShader.replace( + // "#include ", + // ` + // #include + // material.iridescenceFresnel *= customMapAlpha; + // material.iridescenceF0 *= customMapAlpha; + // ` + // ); + // // クリアコートにmapのalphaをかける(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; + // ` + // ); + // // roughnessにmapのalphaをかける(mapだけroughnessする) + // shader.fragmentShader = shader.fragmentShader.replace( + // "#include ", + // ` + // #include + // material.roughness = clamp(material.roughness * customMapAlpha,.24,1.); + // ` + // ); + // // metalnessにmapのalphaをかける(mapだけmetalnessする。あるいは強くする) + // shader.fragmentShader = shader.fragmentShader.replace( + // "#include ", + // ` + // #include + // metalnessFactor *= customMapAlpha; + // ` + // ); + // console.log(shader.fragmentShader); + // }} + /> + + ); +}; diff --git a/app/bananaStickers/page.tsx b/app/bananaStickers/page.tsx new file mode 100644 index 00000000..bde6ca6d --- /dev/null +++ b/app/bananaStickers/page.tsx @@ -0,0 +1,19 @@ +import { Suspense } from "react"; +import { ShaderFx } from "../ShaderFx"; +import { Playground } from "./Playground"; + +export default function Page() { + return ( +
+ + + +
+ ); +} diff --git a/app/bananaStickers/useStickers.ts b/app/bananaStickers/useStickers.ts new file mode 100644 index 00000000..edec6e6d --- /dev/null +++ b/app/bananaStickers/useStickers.ts @@ -0,0 +1,121 @@ +import * as THREE from "three"; +import { useMemo, useCallback, useReducer } from "react"; +import { useFrame, useThree, useLoader } from "@react-three/fiber"; +import { useBlank } from "@/packages/use-shader-fx/src"; + +type StickersState = { + point: THREE.Vector2; + sticker?: THREE.Texture; + size?: number; +}; + +const STICKERSIZE = { + min: 0.04, + max: 0.1, +}; + +export const useStickers = () => { + const stickers = useLoader(THREE.TextureLoader, [ + "/stickers/sticker0.png", + "/stickers/sticker1.png", + "/stickers/sticker2.png", + "/stickers/sticker3.png", + "/stickers/sticker4.png", + "/stickers/sticker5.png", + "/stickers/sticker6.png", + "/stickers/sticker8.png", + "/stickers/sticker9.png", + "/stickers/sticker10.png", + "/stickers/sticker11.png", + "/stickers/sticker12.png", + "/stickers/sticker13.png", + "/stickers/sticker14.png", + "/stickers/sticker15.png", + "/stickers/sticker16.png", + ]); + const { size } = useThree(); + + const [updateBlank, _, { output: sticker }] = useBlank({ + size, + dpr: 4, + uniforms: useMemo( + () => ({ + uStampPoint: { + value: new THREE.Vector2(0), + }, + uRandomSize: { + value: STICKERSIZE.min, + }, + }), + [] + ), + onBeforeCompile: useCallback((shader: any) => { + shader.fragmentShader = shader.fragmentShader.replace( + "#usf ", + ` + uniform vec2 uStampPoint; + uniform float uRandomSize; + ` + ); + + shader.fragmentShader = shader.fragmentShader.replace( + "#usf
", + ` + vec2 uv = vUv; + vec2 stamp = uStampPoint; + + // バッファー取得 + vec4 backColor = texture2D(uBackbuffer,uv); + + uv.x *= 2.; + stamp.x *= 2.; + + // 距離と半径 + float d = distance(uv, stamp); + float r = uRandomSize; + + // スタンプ + vec4 stampColor = texture2D(uTexture,(uv-stamp)/(r*2.)+.5); + + // 最終色 + vec4 finalColor = d { + return { + ...state, + point: point, + sticker: stickers[Math.floor(Math.random() * stickers.length)], + size: + Math.random() * (STICKERSIZE.max - STICKERSIZE.min) + + STICKERSIZE.min, + }; + }, + { + point: new THREE.Vector2(0, 0), + sticker: stickers[0], + size: STICKERSIZE.max, + } + ); + + useFrame((state) => { + updateBlank( + state, + { + texture: stickerState.sticker, + }, + { + uStampPoint: stickerState.point, + uRandomSize: stickerState.size, + } + ); + }); + + return { sticker, setStickerState }; +}; diff --git a/package-lock.json b/package-lock.json index f4e53d83..dd3c10a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,12 +8,12 @@ "name": "use-shader-fx", "version": "0.1.0", "dependencies": { - "@react-three/drei": "^9.105.3", - "@react-three/fiber": "^8.16.1", + "@react-three/drei": "^9.105.6", + "@react-three/fiber": "^8.16.6", "@types/node": "20.5.6", "@types/react": "18.2.21", "@types/react-dom": "18.2.7", - "@types/three": "^0.155.1", + "@types/three": "^0.164.0", "eslint": "8.47.0", "eslint-config-next": "13.4.19", "glslify-loader": "^2.0.0", @@ -25,7 +25,7 @@ "react-dom": "18.2.0", "sass": "^1.66.1", "the-new-css-reset": "^1.9.0", - "three": "^0.155.0", + "three": "^0.162.0", "three-custom-shader-material": "^5.4.0", "three-stdlib": "^2.26.6", "typescript": "5.2.2", @@ -4258,9 +4258,9 @@ "integrity": "sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q==" }, "node_modules/@react-three/drei": { - "version": "9.105.3", - "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.105.3.tgz", - "integrity": "sha512-evX61+LEer9u+3CY6UDUku7+zRSc9Mz4mlfWYgbwrV3XlvimFR0OP21kW2riCcU1t040WOUgPomJPjbZNc03DQ==", + "version": "9.105.6", + "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.105.6.tgz", + "integrity": "sha512-JBgYeV36N9N9f1c3o1ZfLYW4rXZA7UQTq32Y8s3DEF6lwj1/y+RP/yq2VG5I8OzUPl7gsmWdy8fpWZgrlAqUpQ==", "dependencies": { "@babel/runtime": "^7.11.2", "@mediapipe/tasks-vision": "0.10.8", @@ -4279,7 +4279,7 @@ "stats.js": "^0.17.0", "suspend-react": "^0.1.3", "three-mesh-bvh": "^0.7.0", - "three-stdlib": "^2.29.4", + "three-stdlib": "^2.29.9", "troika-three-text": "^0.49.0", "tunnel-rat": "^0.1.2", "utility-types": "^3.10.0", @@ -4326,9 +4326,9 @@ } }, "node_modules/@react-three/fiber": { - "version": "8.16.1", - "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.16.1.tgz", - "integrity": "sha512-Rgjn+xcR+6Do2Ic4b6RROIvCGs3RhoVJEamfmtMSfkgIRH3PeiPdqRxcfJlO9y6KDvYA5fIUGruz9h/sTeLlpw==", + "version": "8.16.6", + "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.16.6.tgz", + "integrity": "sha512-sKEqocYKRI3deW7z9CAVjedDID1an2i8FwxQVv2reMJxzIxIlyxCYXMIAqXBCgHTFtVX2hWGTZYhLL5nyne8kA==", "dependencies": { "@babel/runtime": "^7.17.8", "@types/react-reconciler": "^0.26.7", @@ -6180,9 +6180,9 @@ } }, "node_modules/@tweenjs/tween.js": { - "version": "18.6.4", - "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-18.6.4.tgz", - "integrity": "sha512-lB9lMjuqjtuJrx7/kOkqQBtllspPIN+96OvTCeJ2j5FEzinoAXTdAMFnDAQT1KVPRlnYfBrqxtqP66vDM40xxQ==" + "version": "23.1.2", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.2.tgz", + "integrity": "sha512-kMCNaZCJugWI86xiEHaY338CU5JpD0B97p1j1IKNn/Zto8PgACjQx0UxbHjmOcLl/dDOBnItwD07KmCs75pxtQ==" }, "node_modules/@types/aria-query": { "version": "5.0.4", @@ -6545,22 +6545,21 @@ "integrity": "sha512-9w+a7bR8PeB0dCT/HBULU2fMqf6BAzvKbxFboYhmDtDkKPiyXYbjoe2auwsXlEFI7CFNMF1dCv3dFH5Poy9R1w==" }, "node_modules/@types/three": { - "version": "0.155.1", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.155.1.tgz", - "integrity": "sha512-uNUwnz/wWRxahjIqTtDYQ1qdE1R1py21obxfuILkT+kKrjocMwRLQQA1l8nMxfQU7VXb7CXu04ucMo8OqZt4ZA==", + "version": "0.164.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.164.0.tgz", + "integrity": "sha512-SFDofn9dJVrE+1DKta7xj7lc4ru7B3S3yf10NsxOserW57aQlB6GxtAS1UK5To3LfEMN5HUHMu3n5v+M5rApgA==", "dependencies": { - "@tweenjs/tween.js": "~18.6.4", + "@tweenjs/tween.js": "~23.1.1", "@types/stats.js": "*", "@types/webxr": "*", - "fflate": "~0.6.9", - "lil-gui": "~0.17.0", + "fflate": "~0.8.2", "meshoptimizer": "~0.18.1" } }, - "node_modules/@types/three/node_modules/lil-gui": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/lil-gui/-/lil-gui-0.17.0.tgz", - "integrity": "sha512-MVBHmgY+uEbmJNApAaPbtvNh1RCAeMnKym82SBjtp5rODTYKWtM+MXHCifLe2H2Ti1HuBGBtK/5SyG4ShQ3pUQ==" + "node_modules/@types/three/node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==" }, "node_modules/@types/unist": { "version": "2.0.9", @@ -16086,11 +16085,6 @@ "@types/three": "^0.163.0" } }, - "node_modules/stats-gl/node_modules/@tweenjs/tween.js": { - "version": "23.1.1", - "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.1.tgz", - "integrity": "sha512-ZpboH7pCPPeyBWKf8c7TJswtCEQObFo3bOBYalm99NzZarATALYCo5OhbCa/n4RQyJyHfhkdx+hNrdL5ByFYDw==" - }, "node_modules/stats-gl/node_modules/@types/three": { "version": "0.163.0", "resolved": "https://registry.npmjs.org/@types/three/-/three-0.163.0.tgz", @@ -16744,9 +16738,9 @@ "integrity": "sha512-bKM9xgiVFTqSuWle952Xu/YWE7qYMzPHWxerO0edxjBfPIm2T4k2tRpIJ45IU7knY35Jr6Fb5P/TVm2RIsB//Q==" }, "node_modules/three": { - "version": "0.155.0", - "resolved": "https://registry.npmjs.org/three/-/three-0.155.0.tgz", - "integrity": "sha512-sNgCYmDijnIqkD/bMfk+1pHg3YzsxW7V2ChpuP6HCQ8NiZr3RufsXQr8M3SSUMjW4hG+sUk7YbyuY0DncaDTJQ==" + "version": "0.162.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.162.0.tgz", + "integrity": "sha512-xfCYj4RnlozReCmUd+XQzj6/5OjDNHBy5nT6rVwrOKGENAvpXe2z1jL+DZYaMu4/9pNsjH/4Os/VvS9IrH7IOQ==" }, "node_modules/three-custom-shader-material": { "version": "5.4.0", @@ -16781,9 +16775,9 @@ } }, "node_modules/three-stdlib": { - "version": "2.29.6", - "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.29.6.tgz", - "integrity": "sha512-nj9bHkzhhwfmqQcM/keC2RDb0bHhbw6bRXTy81ehzi8F1rtp6pJ5eS0/vl1Eg5RMFqXOMyxJ6sDHPoLU+IrVZg==", + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.30.0.tgz", + "integrity": "sha512-ALL7rn57jq/MovDRk5hGjeWCvOeZlZhFCWIdpbBAQNudCO3nMwxEba5ZulsMgiI1ymQMzUzTMcxhLTCVlUaKDw==", "dependencies": { "@types/draco3d": "^1.4.0", "@types/offscreencanvas": "^2019.6.4", diff --git a/package.json b/package.json index 1a26400c..98060113 100644 --- a/package.json +++ b/package.json @@ -13,12 +13,12 @@ "create-fx": "git clone https://github.com/takuma-hmng8/CreateShaderFx" }, "dependencies": { - "@react-three/drei": "^9.105.3", - "@react-three/fiber": "^8.16.1", + "@react-three/drei": "^9.105.6", + "@react-three/fiber": "^8.16.6", "@types/node": "20.5.6", "@types/react": "18.2.21", "@types/react-dom": "18.2.7", - "@types/three": "^0.155.1", + "@types/three": "^0.164.0", "eslint": "8.47.0", "eslint-config-next": "13.4.19", "glslify-loader": "^2.0.0", @@ -30,7 +30,7 @@ "react-dom": "18.2.0", "sass": "^1.66.1", "the-new-css-reset": "^1.9.0", - "three": "^0.155.0", + "three": "^0.162.0", "three-custom-shader-material": "^5.4.0", "three-stdlib": "^2.26.6", "typescript": "5.2.2", diff --git a/packages/use-shader-fx/build/use-shader-fx.js b/packages/use-shader-fx/build/use-shader-fx.js deleted file mode 100644 index 4895662b..00000000 --- a/packages/use-shader-fx/build/use-shader-fx.js +++ /dev/null @@ -1,4727 +0,0 @@ -import * as a from "three"; -import { BufferAttribute as De } from "three"; -import { useMemo as b, useEffect as ae, useRef as L, useCallback as D, useState as Ee } from "react"; -var Le = "#usf ", $e = `precision highp float; - -uniform sampler2D uBuffer; -uniform sampler2D uTexture; -uniform bool uIsTexture; -uniform sampler2D uMap; -uniform bool uIsMap; -uniform float uMapIntensity; -uniform float uRadius; -uniform float uDissipation; -uniform vec2 uResolution; -uniform float uSmudge; -uniform vec2 uMouse; -uniform vec2 uPrevMouse; -uniform vec2 uVelocity; -uniform vec3 uColor; -uniform float uMotionBlur; -uniform int uMotionSample; -uniform bool uIsCursor; -uniform float uPressureStart; -uniform float uPressureEnd; - -varying vec2 vUv; - -float isOnLine(vec2 point, vec2 start, vec2 end, float radius, float pressureStart, float pressureEnd) { - - float aspect = uResolution.x / uResolution.y; - - point.x *= aspect; - start.x *= aspect; - end.x *= aspect; - - vec2 dir = normalize(end - start); - vec2 n = vec2(dir.y, -dir.x); - vec2 p0 = point - start; - - float distToLine = abs(dot(p0, n)); - float distAlongLine = dot(p0, dir); - float totalLength = length(end - start); - - float progress = clamp(distAlongLine / totalLength, 0.0, 1.0); - float pressure = mix(pressureStart, pressureEnd, progress); - radius = min(radius,radius * pressure); - - float distFromStart = length(point - start); - float distFromEnd = length(point - end); - - bool withinLine = (distToLine < radius && distAlongLine > 0.0 && distAlongLine < totalLength) || distFromStart < radius || distFromEnd < radius; - - return float(withinLine); -} - -vec4 createSmudge(vec2 uv){ - vec2 offsets[9]; - offsets[0] = vec2(-1, -1); offsets[1] = vec2( 0, -1); offsets[2] = vec2( 1, -1); - offsets[3] = vec2(-1, 0); offsets[4] = vec2( 0, 0); offsets[5] = vec2( 1, 0); - offsets[6] = vec2(-1, 1); offsets[7] = vec2( 0, 1); offsets[8] = vec2( 1, 1); - - for(int i = 0; i < 9; i++) { - offsets[i] = (offsets[i] * uSmudge) / uResolution; - } - vec4 smudgedColor = vec4(0.); - for(int i = 0; i < 9; i++) { - smudgedColor += texture2D(uBuffer, uv + offsets[i]); - } - return smudgedColor / 9.0; -} - -vec4 createMotionBlur(vec2 uv , vec4 baseColor, vec2 velocity) { - vec2 scaledV = velocity * uMotionBlur; - for(int i = 1; i < uMotionSample; i++) { - float t = float(i) / float(uMotionSample - 1); - vec2 offset = t * scaledV / uResolution; - baseColor += texture2D(uBuffer, uv + offset); - } - return baseColor / float(uMotionSample); -} - -void main() { - - vec2 uv = vUv; - if(uIsMap){ - vec2 mapColor = texture2D(uMap, uv).rg; - vec2 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; - } - vec2 suv = uv*2.-1.; - - vec2 velocity = uVelocity * uResolution; - - float radius = max(0.0,uRadius); - - vec4 smudgedColor = uSmudge > 0. ? createSmudge(uv) : texture2D(uBuffer, uv); - - vec4 motionBlurredColor = uMotionBlur > 0. ? createMotionBlur(uv,smudgedColor, velocity) : smudgedColor; - - vec4 bufferColor = motionBlurredColor; - bufferColor.a = bufferColor.a < 1e-10 ? 0.0 : bufferColor.a * uDissipation; - - vec4 brushColor = uIsTexture ? texture2D(uTexture, uv) : vec4(uColor,1.); - - float onLine = isOnLine(suv, uPrevMouse, uMouse, radius, uPressureStart,uPressureEnd); - float isOnLine = length(velocity) > 0. ? onLine : uIsCursor ? onLine : 0.; - - vec4 finalColor = mix(bufferColor, brushColor, isOnLine); - - gl_FragColor = finalColor; -}`; -const Y = (e, t = !1) => { - const n = t ? e.width * t : e.width, r = t ? e.height * t : e.height; - return b( - () => new a.Vector2(n, r), - [n, r] - ); -}, A = (e) => (t, n) => { - if (n === void 0) - return; - const r = e.uniforms; - r && r[t] && (r[t].value = n); -}, z = (e) => (t) => { - t !== void 0 && Object.keys(t).forEach((n) => { - const r = e.uniforms; - r && r[n] && (r[n].value = t[n]); - }); -}, $ = (e, t, n, r) => { - const i = b(() => { - const v = new r(t, n); - return e && e.add(v), v; - }, [t, n, r, e]); - return ae(() => () => { - e && e.remove(i), t.dispose(), n.dispose(); - }, [e, t, n, i]), i; -}, Ie = process.env.NODE_ENV === "development", B = { - transparent: !1, - depthTest: !1, - depthWrite: !1 -}, T = 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);} -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;} - -vec4 grad4(float j, vec4 ip) -{ - const vec4 ones = vec4(1.0, 1.0, 1.0, -1.0); - vec4 p,s; - - p.xyz = floor( fract (vec3(j) * ip.xyz) * 7.0) * ip.z - 1.0; - p.w = 1.5 - dot(abs(p.xyz), ones.xyz); - s = vec4(lessThan(p, vec4(0.0))); - p.xyz = p.xyz + (s.xyz*2.0 - 1.0) * s.www; - - return p; -} - -float simplexNoise4d(vec4 v) -{ - const vec2 C = vec2( 0.138196601125010504, - 0.309016994374947451); - - vec4 i = floor(v + dot(v, C.yyyy) ); - vec4 x0 = v - i + dot(i, C.xxxx); - - - - - vec4 i0; - - vec3 isX = step( x0.yzw, x0.xxx ); - vec3 isYZ = step( x0.zww, x0.yyz ); - - i0.x = isX.x + isX.y + isX.z; - i0.yzw = 1.0 - isX; - - - i0.y += isYZ.x + isYZ.y; - i0.zw += 1.0 - isYZ.xy; - - i0.z += isYZ.z; - i0.w += 1.0 - isYZ.z; - - - vec4 i3 = clamp( i0, 0.0, 1.0 ); - vec4 i2 = clamp( i0-1.0, 0.0, 1.0 ); - vec4 i1 = clamp( i0-2.0, 0.0, 1.0 ); - - - vec4 x1 = x0 - i1 + 1.0 * C.xxxx; - vec4 x2 = x0 - i2 + 2.0 * C.xxxx; - vec4 x3 = x0 - i3 + 3.0 * C.xxxx; - vec4 x4 = x0 - 1.0 + 4.0 * C.xxxx; - - - i = mod(i, 289.0); - float j0 = permute( permute( permute( permute(i.w) + i.z) + i.y) + i.x); - vec4 j1 = permute( permute( permute( permute ( - i.w + vec4(i1.w, i2.w, i3.w, 1.0 )) - + i.z + vec4(i1.z, i2.z, i3.z, 1.0 )) - + i.y + vec4(i1.y, i2.y, i3.y, 1.0 )) - + i.x + vec4(i1.x, i2.x, i3.x, 1.0 )); - - - - - vec4 ip = vec4(1.0/294.0, 1.0/49.0, 1.0/7.0, 0.0) ; - - vec4 p0 = grad4(j0, ip); - vec4 p1 = grad4(j1.x, ip); - vec4 p2 = grad4(j1.y, ip); - vec4 p3 = grad4(j1.z, ip); - vec4 p4 = grad4(j1.w, ip); - - - vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3))); - p0 *= norm.x; - p1 *= norm.y; - p2 *= norm.z; - p3 *= norm.w; - p4 *= taylorInvSqrt(dot(p4,p4)); - - - vec3 m0 = max(0.6 - vec3(dot(x0,x0), dot(x1,x1), dot(x2,x2)), 0.0); - vec2 m1 = max(0.6 - vec2(dot(x3,x3), dot(x4,x4) ), 0.0); - m0 = m0 * m0; - m1 = m1 * m1; - return 49.0 * ( dot(m0*m0, vec3( dot( p0, x0 ), dot( p1, x1 ), dot( p2, x2 ))) - + dot(m1*m1, vec2( dot( p3, x3 ), dot( p4, x4 ) ) ) ) ; - -} - -float getWobble(vec3 position) -{ - vec3 warpedPosition = position; - warpedPosition += simplexNoise4d( - vec4( - position * uWarpPositionFrequency, - uTime * uWarpTimeFrequency - ) - ) * uWarpStrength; - - return simplexNoise4d(vec4( - warpedPosition * uWobblePositionFrequency, - uTime * uWobbleTimeFrequency - )) * uWobbleStrength; -}`, qe = `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); - j *= .125; - r.x = fract(512.0*j); - j *= .125; - r.y = fract(512.0*j); - return r-0.5; -} - -const float F3 = 0.3333333; -const float G3 = 0.1666667; - -float snoise(vec3 p) { - - vec3 s = floor(p + dot(p, vec3(F3))); - vec3 x = p - s + dot(s, vec3(G3)); - - vec3 e = step(vec3(0.0), x - x.yzx); - vec3 i1 = e*(1.0 - e.zxy); - vec3 i2 = 1.0 - e.zxy*(1.0 - e); - - vec3 x1 = x - i1 + G3; - vec3 x2 = x - i2 + 2.0*G3; - vec3 x3 = x - 1.0 + 3.0*G3; - - vec4 w, d; - - w.x = dot(x, x); - w.y = dot(x1, x1); - w.z = dot(x2, x2); - w.w = dot(x3, x3); - - w = max(0.6 - w, 0.0); - - d.x = dot(random3(s), x); - d.y = dot(random3(s + i1), x1); - d.z = dot(random3(s + i2), x2); - d.w = dot(random3(s + 1.0), x3); - - w *= w; - w *= w; - d *= w; - - return dot(d, vec4(52.0)); -} - -float snoiseFractal(vec3 m) { - return 0.5333333* snoise(m) - +0.2666667* snoise(2.0*m) - +0.1333333* snoise(4.0*m) - +0.0666667* snoise(8.0*m); -}`, 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;`, 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;`, ke = `precision highp float; - -varying vec2 vUv; - -void main() { - vUv = uv; - gl_Position = vec4(position, 1.0); -}`; -const Ge = { - wobble3D: je, - snoise: qe, - coverTexture: We, - fxBlending: Ne, - planeVert: ke -}, Ke = /^[ \t]*#usf +<([\w\d./]+)>/gm; -function Xe(e, t) { - let n = Ge[t] || ""; - return be(n); -} -function be(e) { - return e.replace(Ke, Xe); -} -const He = (e) => { - e.vertexShader = be(e.vertexShader), e.fragmentShader = be(e.fragmentShader); -}, V = (e) => (t, n) => { - e && e(t, n), He(t); -}, Ye = ({ - scene: e, - size: t, - dpr: n, - uniforms: r, - onBeforeCompile: i -}) => { - const v = b(() => new a.PlaneGeometry(2, 2), []), s = b(() => { - const d = new a.ShaderMaterial({ - uniforms: { - uBuffer: { value: T }, - uResolution: { value: new a.Vector2(0, 0) }, - uTexture: { value: T }, - uIsTexture: { value: !1 }, - uMap: { value: T }, - uIsMap: { value: !1 }, - 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: ne.color }, - uIsCursor: { value: !1 }, - uPressureStart: { value: 1 }, - uPressureEnd: { value: 1 }, - ...r - }, - vertexShader: Le, - fragmentShader: $e, - ...B, - // Must be transparent - transparent: !0 - }); - return d.onBeforeCompile = V(i), d; - }, [i, r]), u = Y(t, n); - A(s)("uResolution", u.clone()); - const c = $(e, v, s, a.Mesh); - return { material: s, mesh: c }; -}, Qe = (e, t) => { - const n = t, r = e / t, [i, v] = [n * r / 2, n / 2]; - return { width: i, height: v, near: -1e3, far: 1e3 }; -}, j = (e, t = "OrthographicCamera") => { - const n = Y(e), { width: r, height: i, near: v, far: s } = Qe( - n.x, - n.y - ); - return b(() => t === "OrthographicCamera" ? new a.OrthographicCamera( - -r, - r, - i, - -i, - v, - s - ) : new a.PerspectiveCamera(50, r / i), [r, i, v, s, t]); -}, _e = (e = 0) => { - const t = L(new a.Vector2(0, 0)), n = L(new a.Vector2(0, 0)), r = L(new a.Vector2(0, 0)), i = L(0), v = L(new a.Vector2(0, 0)), s = L(!1); - return D( - (c) => { - const d = performance.now(); - let f; - s.current && e ? (r.current = r.current.lerp( - c, - 1 - e - ), f = r.current.clone()) : (f = c.clone(), r.current = f), i.current === 0 && (i.current = d, t.current = f); - const y = Math.max(1, d - i.current); - i.current = d, v.current.copy(f).sub(t.current).divideScalar(y); - const x = v.current.length() > 0, o = s.current ? t.current.clone() : f; - return !s.current && x && (s.current = !0), t.current = f, { - currentPointer: f, - prevPointer: o, - diffPointer: n.current.subVectors(f, o), - velocity: v.current, - isVelocityUpdate: x - }; - }, - [e] - ); -}, q = (e) => { - const n = L( - ((i) => Object.values(i).some((v) => typeof v == "function"))(e) ? e : structuredClone(e) - ), r = D((i) => { - if (i !== void 0) - for (const v in i) { - const s = v; - s in n.current && i[s] !== void 0 && i[s] !== null ? n.current[s] = i[s] : console.error( - `"${String( - s - )}" does not exist in the params. or "${String( - s - )}" is null | undefined` - ); - } - }, []); - return [n.current, r]; -}, he = { - minFilter: a.LinearFilter, - magFilter: a.LinearFilter, - type: a.HalfFloatType, - stencilBuffer: !1 -}, Ce = ({ - gl: e, - fbo: t, - scene: n, - camera: r, - onBeforeRender: i, - onSwap: v -}) => { - e.setRenderTarget(t), i(), e.clear(), e.render(n, r), v && v(), e.setRenderTarget(null), e.clear(); -}, W = ({ - scene: e, - camera: t, - size: n, - dpr: r = !1, - isSizeUpdate: i = !1, - samples: v = 0, - depthBuffer: s = !1, - depthTexture: u = !1 -}) => { - var y; - const c = L(), d = Y(n, r); - c.current = b( - () => { - const x = new a.WebGLRenderTarget( - d.x, - d.y, - { - ...he, - samples: v, - depthBuffer: s - } - ); - return u && (x.depthTexture = new a.DepthTexture( - d.x, - d.y, - a.FloatType - )), x; - }, - // eslint-disable-next-line react-hooks/exhaustive-deps - [] - ), i && ((y = c.current) == null || y.setSize(d.x, d.y)), ae(() => { - const x = c.current; - return () => { - x == null || x.dispose(); - }; - }, []); - const f = D( - (x, o) => { - const g = c.current; - return Ce({ - gl: x, - fbo: g, - scene: e, - camera: t, - onBeforeRender: () => o && o({ read: g.texture }) - }), g.texture; - }, - [e, t] - ); - return [c.current, f]; -}, se = ({ - scene: e, - camera: t, - size: n, - dpr: r = !1, - isSizeUpdate: i = !1, - samples: v = 0, - depthBuffer: s = !1, - depthTexture: u = !1 -}) => { - var x, o; - const c = L({ - read: null, - write: null, - swap: function() { - let g = this.read; - this.read = this.write, this.write = g; - } - }), d = Y(n, r), f = b(() => { - const g = new a.WebGLRenderTarget(d.x, d.y, { - ...he, - samples: v, - depthBuffer: s - }), l = new a.WebGLRenderTarget(d.x, d.y, { - ...he, - samples: v, - depthBuffer: s - }); - return u && (g.depthTexture = new a.DepthTexture( - d.x, - d.y, - a.FloatType - ), l.depthTexture = new a.DepthTexture( - d.x, - d.y, - a.FloatType - )), { read: g, write: l }; - }, []); - c.current.read = f.read, c.current.write = f.write, i && ((x = c.current.read) == null || x.setSize(d.x, d.y), (o = c.current.write) == null || o.setSize(d.x, d.y)), ae(() => { - const g = c.current; - return () => { - var l, p; - (l = g.read) == null || l.dispose(), (p = g.write) == null || p.dispose(); - }; - }, []); - const y = D( - (g, l) => { - var m; - const p = c.current; - return Ce({ - gl: g, - scene: e, - camera: t, - fbo: p.write, - onBeforeRender: () => l && l({ - read: p.read.texture, - write: p.write.texture - }), - onSwap: () => p.swap() - }), (m = p.read) == null ? void 0 : m.texture; - }, - [e, t] - ); - return [ - { read: c.current.read, write: c.current.write }, - y - ]; -}, U = (e) => typeof e == "number" ? { shader: e, fbo: e } : { - shader: e.shader ?? !1, - fbo: e.fbo ?? !1 -}, ne = Object.freeze({ - texture: !1, - map: !1, - mapIntensity: 0.1, - radius: 0.05, - smudge: 0, - dissipation: 1, - motionBlur: 0, - motionSample: 5, - color: new a.Vector3(1, 0, 0), - isCursor: !1, - pressure: 1, - pointerValues: !1 -}), Gn = ({ - size: e, - dpr: t, - samples: n, - isSizeUpdate: r, - uniforms: i, - onBeforeCompile: v -}) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = Ye({ - scene: u, - size: e, - dpr: s.shader, - uniforms: i, - onBeforeCompile: v - }), f = j(e), y = _e(), [x, o] = se({ - scene: u, - camera: f, - size: e, - dpr: s.fbo, - samples: n, - isSizeUpdate: r - }), [g, l] = q(ne), p = L(null), m = A(c), C = z(c), M = D( - (S, _) => { - l(S), C(_); - }, - [l, C] - ); - return [ - D( - (S, _, w) => { - const { gl: I, pointer: R } = S; - M(_, w), g.texture ? (m("uIsTexture", !0), m("uTexture", g.texture)) : m("uIsTexture", !1), g.map ? (m("uIsMap", !0), m("uMap", g.map), m("uMapIntensity", g.mapIntensity)) : m("uIsMap", !1), m("uRadius", g.radius), m("uSmudge", g.smudge), m("uDissipation", g.dissipation), m("uMotionBlur", g.motionBlur), m("uMotionSample", g.motionSample); - const F = g.pointerValues || y(R); - F.isVelocityUpdate && (m("uMouse", F.currentPointer), m("uPrevMouse", F.prevPointer)), m("uVelocity", F.velocity); - const P = typeof g.color == "function" ? g.color(F.velocity) : g.color; - return m("uColor", P), m("uIsCursor", g.isCursor), m("uPressureEnd", g.pressure), p.current === null && (p.current = g.pressure), m("uPressureStart", p.current), p.current = g.pressure, o(I, ({ read: O }) => { - m("uBuffer", O); - }); - }, - [m, y, o, g, M] - ), - M, - { - scene: u, - mesh: d, - material: c, - camera: f, - renderTarget: x, - output: x.read.texture - } - ]; -}; -var ee = `varying vec2 vUv; -varying vec2 vL; -varying vec2 vR; -varying vec2 vT; -varying vec2 vB; -uniform vec2 texelSize; - -void main () { - vUv = uv; - vL = vUv - vec2(texelSize.x, 0.0); - vR = vUv + vec2(texelSize.x, 0.0); - vT = vUv + vec2(0.0, texelSize.y); - vB = vUv - vec2(0.0, texelSize.y); - gl_Position = vec4(position, 1.0); -}`, Ze = `precision highp float; - -void main(){ - gl_FragColor = vec4(0.0); -}`; -const Je = () => b(() => new a.ShaderMaterial({ - vertexShader: ee, - fragmentShader: Ze, - ...B -}), []); -var et = `precision highp float; - -varying vec2 vUv; -uniform sampler2D uVelocity; -uniform sampler2D uSource; -uniform vec2 texelSize; -uniform float dt; -uniform float dissipation; - -void main () { - vec2 coord = vUv - dt * texture2D(uVelocity, vUv).xy * texelSize; - gl_FragColor = vec4(dissipation * texture2D(uSource, coord).rgb,1.); -}`; -const tt = ({ - onBeforeCompile: e, - uniforms: t -}) => b(() => { - const r = new a.ShaderMaterial({ - uniforms: { - uVelocity: { value: T }, - uSource: { value: T }, - texelSize: { value: new a.Vector2() }, - dt: { value: Fe }, - dissipation: { value: 0 }, - ...t - }, - vertexShader: ee, - fragmentShader: et, - ...B - }); - return r.onBeforeCompile = V(e), r; -}, [e, t]); -var nt = `precision highp float; - -varying vec2 vUv; -varying vec2 vL; -varying vec2 vR; -varying vec2 vT; -varying vec2 vB; -uniform sampler2D uVelocity; - -vec2 sampleVelocity(in vec2 uv) { - vec2 clampedUV = clamp(uv, 0.0, 1.0); - vec2 multiplier = vec2(1.0, 1.0); - multiplier.x = uv.x < 0.0 || uv.x > 1.0 ? -1.0 : 1.0; - multiplier.y = uv.y < 0.0 || uv.y > 1.0 ? -1.0 : 1.0; - return multiplier * texture2D(uVelocity, clampedUV).xy; -} - -void main () { - float L = sampleVelocity(vL).x; - float R = sampleVelocity(vR).x; - float T = sampleVelocity(vT).y; - float B = sampleVelocity(vB).y; - float div = 0.5 * (R - L + T - B); - gl_FragColor = vec4(div, 0.0, 0.0, 1.0); -}`; -const rt = ({ - onBeforeCompile: e, - uniforms: t -}) => b(() => { - const r = new a.ShaderMaterial({ - uniforms: { - uVelocity: { value: null }, - texelSize: { value: new a.Vector2() }, - ...t - }, - vertexShader: ee, - fragmentShader: nt, - ...B - }); - return r.onBeforeCompile = V(e), r; -}, [e, t]); -var ot = `precision highp float; - -varying vec2 vUv; -varying vec2 vL; -varying vec2 vR; -varying vec2 vT; -varying vec2 vB; -uniform sampler2D uPressure; -uniform sampler2D uDivergence; - -void main () { - float L = texture2D(uPressure, clamp(vL,0.,1.)).x; - float R = texture2D(uPressure, clamp(vR,0.,1.)).x; - float T = texture2D(uPressure, clamp(vT,0.,1.)).x; - float B = texture2D(uPressure, clamp(vB,0.,1.)).x; - float C = texture2D(uPressure, vUv).x; - 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 at = ({ - onBeforeCompile: e, - uniforms: t -}) => b(() => { - const r = new a.ShaderMaterial({ - uniforms: { - uPressure: { value: null }, - uDivergence: { value: null }, - texelSize: { value: new a.Vector2() }, - ...t - }, - vertexShader: ee, - fragmentShader: ot, - ...B - }); - return r.onBeforeCompile = V(e), r; -}, [e, t]); -var it = `precision highp float; - -varying vec2 vUv; -varying vec2 vL; -varying vec2 vR; -varying vec2 vT; -varying vec2 vB; -uniform sampler2D uVelocity; - -void main () { - float L = texture2D(uVelocity, vL).y; - float R = texture2D(uVelocity, vR).y; - float T = texture2D(uVelocity, vT).x; - float B = texture2D(uVelocity, vB).x; - float vorticity = R - L - T + B; - gl_FragColor = vec4(vorticity, 0.0, 0.0, 1.0); -}`; -const ut = ({ - onBeforeCompile: e, - uniforms: t -}) => b(() => { - const r = new a.ShaderMaterial({ - uniforms: { - uVelocity: { value: null }, - texelSize: { value: new a.Vector2() }, - ...t - }, - vertexShader: ee, - fragmentShader: it, - ...B - }); - return r.onBeforeCompile = V(e), r; -}, [e, t]); -var st = `precision highp float; - -varying vec2 vUv; -varying vec2 vT; -varying vec2 vB; -uniform sampler2D uVelocity; -uniform sampler2D uCurl; -uniform float curl; -uniform float dt; - -void main () { - float T = texture2D(uCurl, vT).x; - float B = texture2D(uCurl, vB).x; - float C = texture2D(uCurl, vUv).x; - vec2 force = vec2(abs(T) - abs(B), 0.0); - 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 lt = ({ - onBeforeCompile: e, - uniforms: t -}) => b(() => { - const r = new a.ShaderMaterial({ - uniforms: { - uVelocity: { value: null }, - uCurl: { value: null }, - curl: { value: 0 }, - dt: { value: Fe }, - texelSize: { value: new a.Vector2() }, - ...t - }, - vertexShader: ee, - fragmentShader: st, - ...B - }); - return r.onBeforeCompile = V(e), r; -}, [e, t]); -var ct = `precision highp float; - -varying vec2 vUv; -uniform sampler2D uTexture; -uniform float value; - -void main () { - gl_FragColor = value * texture2D(uTexture, vUv); -}`; -const vt = ({ - onBeforeCompile: e, - uniforms: t -}) => b(() => { - const r = new a.ShaderMaterial({ - uniforms: { - uTexture: { value: T }, - value: { value: 0 }, - texelSize: { value: new a.Vector2() }, - ...t - }, - vertexShader: ee, - fragmentShader: ct, - ...B - }); - return r.onBeforeCompile = V(e), r; -}, [e, t]); -var pt = `precision highp float; - -varying vec2 vUv; -varying vec2 vL; -varying vec2 vR; -varying vec2 vT; -varying vec2 vB; -uniform sampler2D uPressure; -uniform sampler2D uVelocity; - -void main () { - float L = texture2D(uPressure, clamp(vL,0.,1.)).x; - float R = texture2D(uPressure, clamp(vR,0.,1.)).x; - float T = texture2D(uPressure, clamp(vT,0.,1.)).x; - float B = texture2D(uPressure, clamp(vB,0.,1.)).x; - vec2 velocity = texture2D(uVelocity, vUv).xy; - velocity.xy -= vec2(R - L, T - B); - gl_FragColor = vec4(velocity, 0.0, 1.0); -}`; -const mt = ({ - onBeforeCompile: e, - uniforms: t -}) => b(() => { - const r = new a.ShaderMaterial({ - uniforms: { - uPressure: { value: T }, - uVelocity: { value: T }, - texelSize: { value: new a.Vector2() }, - ...t - }, - vertexShader: ee, - fragmentShader: pt, - ...B - }); - return r.onBeforeCompile = V(e), r; -}, [e, t]); -var ft = `precision highp float; - -varying vec2 vUv; -uniform sampler2D uTarget; -uniform float aspectRatio; -uniform vec3 color; -uniform vec2 point; -uniform float radius; - -void main () { - vec2 nPoint = (point + vec2(1.0)) * 0.5; - vec2 p = vUv - nPoint.xy; - p.x *= aspectRatio; - vec3 splat = exp(-dot(p, p) / radius) * color; - vec3 base = texture2D(uTarget, vUv).xyz; - gl_FragColor = vec4(base + splat, 1.0); -}`; -const dt = ({ - onBeforeCompile: e, - uniforms: t -}) => b(() => { - const r = new a.ShaderMaterial({ - uniforms: { - uTarget: { value: T }, - aspectRatio: { value: 0 }, - color: { value: new a.Vector3() }, - point: { value: new a.Vector2() }, - radius: { value: 0 }, - texelSize: { value: new a.Vector2() }, - ...t - }, - vertexShader: ee, - fragmentShader: ft, - ...B - }); - return r.onBeforeCompile = V(e), r; -}, [e, t]), Q = (e, t) => e(t ?? {}), gt = ({ - scene: e, - size: t, - dpr: n, - customFluidProps: r -}) => { - const i = b(() => new a.PlaneGeometry(2, 2), []), { - curl: v, - vorticity: s, - advection: u, - divergence: c, - pressure: d, - clear: f, - gradientSubtract: y, - splat: x - } = r ?? {}, o = Q(Je), g = o.clone(), l = Q(ut, v), p = Q(lt, s), m = Q(tt, u), C = Q( - rt, - c - ), M = Q(at, d), h = Q(vt, f), S = Q( - mt, - y - ), _ = Q(dt, x), w = b( - () => ({ - vorticityMaterial: p, - curlMaterial: l, - advectionMaterial: m, - divergenceMaterial: C, - pressureMaterial: M, - clearMaterial: h, - gradientSubtractMaterial: S, - splatMaterial: _ - }), - [ - p, - l, - m, - C, - M, - h, - S, - _ - ] - ), I = Y(t, n); - b(() => { - A(w.splatMaterial)( - "aspectRatio", - I.x / I.y - ); - for (const P of Object.values(w)) - A(P)( - "texelSize", - new a.Vector2(1 / I.x, 1 / I.y) - ); - }, [I, w]); - const R = $(e, i, o, a.Mesh); - b(() => { - o.dispose(), R.material = g; - }, [o, R, g]), ae(() => () => { - for (const P of Object.values(w)) - P.dispose(); - }, [w]); - const F = D( - (P) => { - R.material = P, R.material.needsUpdate = !0; - }, - [R] - ); - return { materials: w, setMeshMaterial: F, mesh: R }; -}, Fe = 0.016, ht = Object.freeze({ - density_dissipation: 0.98, - velocity_dissipation: 0.99, - velocity_acceleration: 10, - pressure_dissipation: 0.9, - pressure_iterations: 20, - curl_strength: 35, - splat_radius: 2e-3, - fluid_color: new a.Vector3(1, 1, 1), - pointerValues: !1 -}), Kn = ({ - size: e, - dpr: t, - samples: n, - isSizeUpdate: r, - customFluidProps: i -}) => { - const v = U(t), s = b(() => new a.Scene(), []), { materials: u, setMeshMaterial: c, mesh: d } = gt({ - scene: s, - size: e, - dpr: v.shader, - customFluidProps: i - }), f = j(e), y = _e(), x = b( - () => ({ - scene: s, - camera: f, - dpr: v.fbo, - size: e, - samples: n, - isSizeUpdate: r - }), - [s, f, e, n, v.fbo, r] - ), [o, g] = se(x), [l, p] = se(x), [m, C] = W(x), [M, h] = W(x), [S, _] = se(x), w = L(new a.Vector2(0, 0)), I = L(new a.Vector3(0, 0, 0)), [R, F] = q(ht), P = b( - () => ({ - 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] - ), O = b( - () => ({ - advection: z(u.advectionMaterial), - splat: z(u.splatMaterial), - curl: z(u.curlMaterial), - vorticity: z(u.vorticityMaterial), - divergence: z(u.divergenceMaterial), - clear: z(u.clearMaterial), - pressure: z(u.pressureMaterial), - gradientSubtract: z(u.gradientSubtractMaterial) - }), - [u] - ), k = D( - (H, K) => { - F(H), K && Object.keys(K).forEach((ie) => { - O[ie]( - K[ie] - ); - }); - }, - [F, O] - ); - return [ - D( - (H, K, ie) => { - const { gl: X, pointer: xe, size: we } = H; - k(K, ie); - const ye = g(X, ({ read: G }) => { - c(u.advectionMaterial), P.advection("uVelocity", G), P.advection("uSource", G), P.advection( - "dissipation", - R.velocity_dissipation - ); - }), Be = p(X, ({ read: G }) => { - c(u.advectionMaterial), P.advection("uVelocity", ye), P.advection("uSource", G), P.advection( - "dissipation", - R.density_dissipation - ); - }), me = R.pointerValues || y(xe); - me.isVelocityUpdate && (g(X, ({ read: G }) => { - c(u.splatMaterial), P.splat("uTarget", G), P.splat("point", me.currentPointer); - const le = me.diffPointer.multiply( - w.current.set(we.width, we.height).multiplyScalar(R.velocity_acceleration) - ); - P.splat( - "color", - I.current.set(le.x, le.y, 1) - ), P.splat("radius", R.splat_radius); - }), p(X, ({ read: G }) => { - c(u.splatMaterial), P.splat("uTarget", G); - const le = typeof R.fluid_color == "function" ? R.fluid_color(me.velocity) : R.fluid_color; - P.splat("color", le); - })); - const Oe = C(X, () => { - c(u.curlMaterial), P.curl("uVelocity", ye); - }); - g(X, ({ read: G }) => { - c(u.vorticityMaterial), P.vorticity("uVelocity", G), P.vorticity("uCurl", Oe), P.vorticity("curl", R.curl_strength); - }); - const Ue = h(X, () => { - c(u.divergenceMaterial), P.divergence("uVelocity", ye); - }); - _(X, ({ read: G }) => { - c(u.clearMaterial), P.clear("uTexture", G), P.clear("value", R.pressure_dissipation); - }), c(u.pressureMaterial), P.pressure("uDivergence", Ue); - let Te; - for (let G = 0; G < R.pressure_iterations; G++) - Te = _(X, ({ read: le }) => { - P.pressure("uPressure", le); - }); - return g(X, ({ read: G }) => { - c(u.gradientSubtractMaterial), P.gradientSubtract("uPressure", Te), P.gradientSubtract("uVelocity", G); - }), Be; - }, - [ - u, - P, - c, - C, - p, - h, - y, - _, - g, - R, - k - ] - ), - k, - { - scene: s, - mesh: d, - materials: u, - camera: f, - renderTarget: { - velocity: o, - density: l, - curl: m, - divergence: M, - pressure: S - }, - output: l.read.texture - } - ]; -}; -var xt = `varying vec2 vUv; - -void main() { - vUv = uv; - gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); -}`, yt = `precision highp float; - -uniform sampler2D uMap; -uniform float uOpacity; - -varying vec2 vUv; - -void main() { - vec2 uv = vUv; - vec3 color = texture2D(uMap, uv).rgb; - gl_FragColor = vec4(color,uOpacity); -}`; -const bt = ({ - scale: e, - max: t, - texture: n, - scene: r, - uniforms: i, - onBeforeCompile: v -}) => { - const s = b( - () => new a.PlaneGeometry(e, e), - [e] - ), u = b(() => new a.ShaderMaterial({ - uniforms: { - uOpacity: { value: 0 }, - uMap: { value: n || T }, - ...i - }, - blending: a.AdditiveBlending, - vertexShader: xt, - fragmentShader: yt, - ...B, - // Must be transparent. - transparent: !0 - }), [n, i]), c = b(() => { - const d = []; - for (let f = 0; f < t; f++) { - const y = u.clone(); - y.onBeforeCompile = V(v); - const x = new a.Mesh(s.clone(), y); - x.rotateZ(2 * Math.PI * Math.random()), x.visible = !1, r.add(x), d.push(x); - } - return d; - }, [v, s, u, r, t]); - return ae(() => () => { - c.forEach((d) => { - d.geometry.dispose(), Array.isArray(d.material) ? d.material.forEach((f) => f.dispose()) : d.material.dispose(), r.remove(d); - }); - }, [r, c]), c; -}, Mt = Object.freeze({ - frequency: 0.01, - rotation: 0.05, - fadeout_speed: 0.9, - scale: 0.3, - alpha: 0.6, - pointerValues: !1 -}), Xn = ({ - texture: e, - scale: t = 64, - max: n = 100, - size: r, - dpr: i, - samples: v, - isSizeUpdate: s, - uniforms: u, - onBeforeCompile: c -}) => { - const d = U(i), f = b(() => new a.Scene(), []), y = bt({ - scale: t, - max: n, - texture: e, - scene: f, - uniforms: u, - onBeforeCompile: c - }), x = j(r), o = _e(), [g, l] = W({ - scene: f, - camera: x, - size: r, - dpr: d.fbo, - samples: v, - isSizeUpdate: s - }), [p, m] = q(Mt), C = L(0), M = b(() => (S, _) => { - m(S), y.forEach((w) => { - if (w.visible) { - const I = w.material; - w.rotation.z += p.rotation, w.scale.x = p.fadeout_speed * w.scale.x + p.scale, w.scale.y = w.scale.x; - const R = I.uniforms.uOpacity.value; - A(I)( - "uOpacity", - R * p.fadeout_speed - ), R < 1e-3 && (w.visible = !1); - } - z(w.material)(_); - }); - }, [y, p, m]); - return [ - D( - (S, _, w) => { - const { gl: I, pointer: R, size: F } = S; - M(_, w); - const P = p.pointerValues || o(R); - if (p.frequency < P.diffPointer.length()) { - const O = y[C.current], k = O.material; - O.visible = !0, O.position.set( - P.currentPointer.x * (F.width / 2), - P.currentPointer.y * (F.height / 2), - 0 - ), O.scale.x = O.scale.y = 0, A(k)("uOpacity", p.alpha), C.current = (C.current + 1) % n; - } - return l(I); - }, - [l, y, o, n, p, M] - ), - M, - { - scene: f, - camera: x, - meshArr: y, - renderTarget: g, - output: g.texture - } - ]; -}; -var St = "#usf ", _t = `precision highp float; -precision highp int; - -varying vec2 vUv; -uniform float uTime; -uniform float timeStrength; -uniform int noiseOctaves; -uniform int fbmOctaves; -uniform int warpOctaves; -uniform vec2 warpDirection; -uniform float warpStrength; -uniform float scale; - -const float per = 0.5; -const float PI = 3.14159265359; - -float rnd(vec2 n) { - float a = 0.129898; - float b = 0.78233; - float c = 437.585453; - float dt= dot(n ,vec2(a, b)); - float sn= mod(dt, PI); - return fract(sin(sn) * c); -} - -float interpolate(float a, float b, float x){ - float f = (1.0 - cos(x * PI)) * 0.5; - return a * (1.0 - f) + b * f; -} - -float irnd(vec2 p){ - vec2 i = floor(p); - vec2 f = fract(p); - vec4 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))); - return interpolate(interpolate(v.x, v.y, f.x), interpolate(v.z, v.w, f.x), f.y); -} - -float noise(vec2 p, float time){ - float t = 0.0; - for(int i = 0; i < noiseOctaves; i++){ - float freq = pow(2.0, float(i)); - float amp = pow(per, float(noiseOctaves - i)); - t += irnd(vec2(p.y / freq + time, p.x / freq + time)) * amp; - } - return t; -} - -float fbm(vec2 x, float time) { - float v = 0.0; - float a = 0.5; - vec2 shift = vec2(100); - mat2 rot = mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.5)); - float sign = 1.0; - for (int i = 0; i < fbmOctaves; ++i) { - v += a * noise(x, time * sign); - x = rot * x * 2.0 + shift; - a *= 0.5; - sign *= -1.0; - } - return v; -} - -float warp(vec2 x, float g,float time){ - float val = 0.0; - for (int i = 0; i < warpOctaves; i++){ - val = fbm(x + g * vec2(cos(warpDirection.x * val), sin(warpDirection.y * val)), time); - } - return val; -} - -void main() { - float noise = warp(gl_FragCoord.xy * scale ,warpStrength,uTime * timeStrength); - gl_FragColor = vec4(vec3(noise),1.0); -}`; -const Ct = ({ - scene: e, - uniforms: t, - onBeforeCompile: n -}) => { - const r = b(() => new a.PlaneGeometry(2, 2), []), i = b(() => { - const s = new a.ShaderMaterial({ - uniforms: { - uTime: { value: 0 }, - 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 }, - ...t - }, - vertexShader: St, - fragmentShader: _t, - ...B - }); - return s.onBeforeCompile = V(n), s; - }, [n, t]), v = $(e, r, i, a.Mesh); - return { material: i, mesh: v }; -}, re = Object.freeze({ - scale: 4e-3, - timeStrength: 0.3, - noiseOctaves: 2, - fbmOctaves: 2, - warpOctaves: 2, - warpDirection: new a.Vector2(2, 2), - warpStrength: 8, - beat: !1 -}), Hn = ({ - size: e, - dpr: t, - samples: n, - isSizeUpdate: r, - uniforms: i, - onBeforeCompile: v -}) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = Ct({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), [y, x] = W({ - scene: u, - camera: f, - size: e, - dpr: s.fbo, - samples: n, - isSizeUpdate: r - }), [o, g] = q(re), l = A(c), p = z(c), m = D( - (M, h) => { - g(M), p(h); - }, - [g, p] - ); - return [ - D( - (M, h, S) => { - const { gl: _, clock: w } = M; - return m(h, 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 || w.getElapsedTime()), x(_); - }, - [x, l, o, m] - ), - m, - { - scene: u, - mesh: d, - material: c, - camera: f, - renderTarget: y, - output: y.texture - } - ]; -}; -var wt = "#usf ", Tt = `precision highp float; -varying vec2 vUv; - -uniform sampler2D uTexture; -uniform bool isTexture; -uniform sampler2D noise; -uniform bool isNoise; -uniform vec2 noiseStrength; -uniform float laminateLayer; -uniform vec2 laminateInterval; -uniform vec2 laminateDetail; -uniform vec2 distortion; -uniform vec3 colorFactor; -uniform float uTime; -uniform vec2 timeStrength; -uniform float scale; - -void main() { - vec2 uv = vUv; - - vec2 pos = isTexture ? texture2D(uTexture, uv).rg : uv * scale; - vec2 noise = isNoise ? texture2D(noise, uv).rg : vec2(0.0); - float alpha = isTexture ? texture2D(uTexture, uv).a : 1.0; - - - alpha = (alpha < 1e-10) ? 0.0 : alpha; - - vec3 col; - for(float j = 0.0; j < 3.0; j++){ - for(float i = 1.0; i < laminateLayer; i++){ - float timeNoiseSin = sin(uTime / (i + j)) * timeStrength.x + noise.r * noiseStrength.x; - float timeNoiseCos = cos(uTime / (i + j)) * timeStrength.y + noise.g * noiseStrength.y; - pos.x += laminateInterval.x / (i + j) * cos(i * distortion.x * pos.y + timeNoiseSin + sin(i + j)); - pos.y += laminateInterval.y / (i + j) * cos(i * distortion.y * pos.x + timeNoiseCos + sin(i + j)); - } - col[int(j)] = sin(pow(pos.x, 2.) * pow(laminateDetail.x, 2.)) + sin(pow(pos.y, 2.) * pow(laminateDetail.y, 2.)); - } - - col *= colorFactor * alpha; - col = clamp(col, 0.0, 1.0); - - gl_FragColor = vec4(col, alpha); -}`; -const Dt = ({ - scene: e, - uniforms: t, - onBeforeCompile: n -}) => { - const r = b(() => new a.PlaneGeometry(2, 2), []), i = b(() => { - const s = new a.ShaderMaterial({ - uniforms: { - uTexture: { value: T }, - isTexture: { value: !1 }, - scale: { value: Z.scale }, - noise: { value: T }, - noiseStrength: { value: Z.noiseStrength }, - isNoise: { value: !1 }, - laminateLayer: { value: Z.laminateLayer }, - laminateInterval: { value: Z.laminateInterval }, - laminateDetail: { value: Z.laminateDetail }, - distortion: { value: Z.distortion }, - colorFactor: { value: Z.colorFactor }, - uTime: { value: 0 }, - timeStrength: { value: Z.timeStrength }, - ...t - }, - vertexShader: wt, - fragmentShader: Tt, - ...B - }); - return s.onBeforeCompile = V(n), s; - }, [n, t]), v = $(e, r, i, a.Mesh); - return { material: i, mesh: v }; -}, Z = Object.freeze({ - texture: !1, - scale: 1, - laminateLayer: 1, - laminateInterval: new a.Vector2(0.1, 0.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 -}), Yn = ({ - size: e, - dpr: t, - samples: n, - isSizeUpdate: r, - uniforms: i, - onBeforeCompile: v -}) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = Dt({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), [y, x] = W({ - scene: u, - camera: f, - size: e, - dpr: s.fbo, - samples: n, - isSizeUpdate: r - }), [o, g] = q(Z), l = A(c), p = z(c), m = D( - (M, h) => { - g(M), p(h); - }, - [g, p] - ); - return [ - D( - (M, h, S) => { - const { gl: _, clock: w } = M; - return m(h, 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 || w.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), x(_); - }, - [x, l, o, m] - ), - m, - { - scene: u, - mesh: d, - material: c, - camera: f, - renderTarget: y, - output: y.texture - } - ]; -}; -var Pt = "#usf ", Rt = `precision highp float; - -varying vec2 vUv; -uniform float u_time; -uniform float u_pattern; -uniform float u_complexity; -uniform float u_complexityAttenuation; -uniform float u_iterations; -uniform float u_timeStrength; -uniform float u_scale; - -vec3 marble(vec3 p){ - vec4 n; - for(float i;i { - const r = b(() => new a.PlaneGeometry(2, 2), []), i = b(() => { - const s = new a.ShaderMaterial({ - uniforms: { - u_time: { value: 0 }, - u_pattern: { value: ue.pattern }, - u_complexity: { value: ue.complexity }, - u_complexityAttenuation: { - value: ue.complexityAttenuation - }, - u_iterations: { value: ue.iterations }, - u_timeStrength: { value: ue.timeStrength }, - u_scale: { value: ue.scale }, - ...t - }, - vertexShader: Pt, - fragmentShader: Rt, - ...B - }); - return s.onBeforeCompile = V(n), s; - }, [n, t]), v = $(e, r, i, a.Mesh); - return { material: i, mesh: v }; -}, ue = Object.freeze({ - pattern: 0, - complexity: 2, - complexityAttenuation: 0.2, - iterations: 8, - timeStrength: 0.2, - scale: 2e-3, - beat: !1 -}), Qn = ({ - size: e, - dpr: t, - samples: n, - isSizeUpdate: r, - uniforms: i, - onBeforeCompile: v -}) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = At({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), [y, x] = W({ - scene: u, - camera: f, - size: e, - dpr: s.fbo, - samples: n, - isSizeUpdate: r - }), [o, g] = q(ue), l = A(c), p = z(c), m = D( - (M, h) => { - g(M), p(h); - }, - [g, p] - ); - return [ - D( - (M, h, S) => { - const { gl: _, clock: w } = M; - return m(h, 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 || w.getElapsedTime()), x(_); - }, - [x, l, o, m] - ), - m, - { - scene: u, - mesh: d, - material: c, - camera: f, - renderTarget: y, - output: y.texture - } - ]; -}; -var It = "#usf ", Ft = `precision highp float; -precision highp int; - -varying vec2 vUv; -uniform sampler2D uTexture; -uniform vec3 uColor1; -uniform vec3 uColor2; -uniform vec3 uColor3; -uniform vec3 uColor4; -uniform vec3 uRgbWeight; - -vec3 cosPalette( float t, vec3 color1, vec3 color2, vec3 color3, vec3 color4 ){ - return color1 + color2 * cos( 6.28318 * ( color3 * t + color4) ); -} - -void main() { - - vec4 tex = texture2D(uTexture, vUv); - float gray = dot(tex.rgb, uRgbWeight); - - vec3 outColor = cosPalette( - gray, - uColor1, - uColor2, - uColor3, - uColor4 - ); - - gl_FragColor = vec4(outColor, tex.a); -}`; -const Vt = ({ - scene: e, - uniforms: t, - onBeforeCompile: n -}) => { - const r = b(() => new a.PlaneGeometry(2, 2), []), i = b(() => { - const s = new a.ShaderMaterial({ - uniforms: { - uTexture: { value: T }, - uRgbWeight: { value: ce.rgbWeight }, - uColor1: { value: ce.color1 }, - uColor2: { value: ce.color2 }, - uColor3: { value: ce.color3 }, - uColor4: { value: ce.color4 }, - ...t - }, - vertexShader: It, - fragmentShader: Ft, - ...B - }); - return s.onBeforeCompile = V(n), s; - }, [n, t]), v = $(e, r, i, a.Mesh); - return { material: i, mesh: v }; -}, ce = Object.freeze({ - texture: T, - 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) -}), Zn = ({ - size: e, - dpr: t, - samples: n, - isSizeUpdate: r, - uniforms: i, - onBeforeCompile: v -}) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = Vt({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), [y, x] = W({ - scene: u, - camera: f, - size: e, - dpr: s.fbo, - samples: n, - isSizeUpdate: r - }), [o, g] = q(ce), l = A(c), p = z(c), m = D( - (M, h) => { - g(M), p(h); - }, - [g, p] - ); - return [ - D( - (M, h, S) => { - const { gl: _ } = M; - return m(h, 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), x(_); - }, - [x, l, o, m] - ), - m, - { - scene: u, - mesh: d, - material: c, - camera: f, - renderTarget: y, - output: y.texture - } - ]; -}; -var zt = "#usf ", Bt = `precision highp float; - -varying vec2 vUv; -uniform sampler2D uTexture; - -uniform vec3 uColor0; -uniform vec3 uColor1; - -void main() { - vec2 uv = vUv; - vec4 texColor = texture2D(uTexture, uv); - 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 Ot = ({ - scene: e, - uniforms: t, - onBeforeCompile: n -}) => { - const r = b(() => new a.PlaneGeometry(2, 2), []), i = b(() => { - const s = new a.ShaderMaterial({ - uniforms: { - uTexture: { value: T }, - uColor0: { value: Me.color0 }, - uColor1: { value: Me.color1 }, - ...t - }, - vertexShader: zt, - fragmentShader: Bt, - ...B - }); - return s.onBeforeCompile = V(n), s; - }, [n, t]), v = $(e, r, i, a.Mesh); - return { material: i, mesh: v }; -}, Me = Object.freeze({ - texture: T, - color0: new a.Color(16777215), - color1: new a.Color(0) -}), Jn = ({ - size: e, - dpr: t, - samples: n, - isSizeUpdate: r, - uniforms: i, - onBeforeCompile: v -}) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = Ot({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), [y, x] = W({ - scene: u, - camera: f, - size: e, - dpr: s.fbo, - samples: n, - isSizeUpdate: r - }), [o, g] = q(Me), l = A(c), p = z(c), m = D( - (M, h) => { - g(M), p(h); - }, - [g, p] - ); - return [ - D( - (M, h, S) => { - const { gl: _ } = M; - return m(h, S), l("uTexture", o.texture), l("uColor0", o.color0), l("uColor1", o.color1), x(_); - }, - [x, l, o, m] - ), - m, - { - scene: u, - mesh: d, - material: c, - camera: f, - renderTarget: y, - output: y.texture - } - ]; -}; -var Ut = "#usf ", Et = `precision highp float; - -varying vec2 vUv; -uniform sampler2D u_texture; -uniform sampler2D uMap; -uniform bool u_isAlphaMap; -uniform sampler2D u_alphaMap; -uniform float uMapIntensity; -uniform vec3 u_brightness; -uniform float u_min; -uniform float u_max; -uniform vec3 u_dodgeColor; -uniform bool u_isDodgeColor; - -void main() { - vec2 uv = vUv; - - #usf - - - float brightness = dot(mapColor,u_brightness); - vec4 textureMap = texture2D(u_texture, uv); - float blendValue = smoothstep(u_min, u_max, brightness); - - - vec3 dodgeColor = u_isDodgeColor ? u_dodgeColor : mapColor; - vec3 outputColor = blendValue * dodgeColor + (1.0 - blendValue) * textureMap.rgb; - - - float alpha = u_isAlphaMap ? texture2D(u_alphaMap, uv).a : textureMap.a; - float mixValue = u_isAlphaMap ? alpha : 0.0; - vec3 alphaColor = vec3(mix(outputColor,mapColor,mixValue)); - - gl_FragColor = vec4(alphaColor,alpha); -}`; -const Lt = ({ - scene: e, - uniforms: t, - onBeforeCompile: n -}) => { - const r = b(() => new a.PlaneGeometry(2, 2), []), i = b(() => { - const s = new a.ShaderMaterial({ - uniforms: { - u_texture: { value: T }, - uMap: { value: T }, - u_alphaMap: { value: T }, - u_isAlphaMap: { value: !1 }, - 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 }, - ...t - }, - vertexShader: Ut, - fragmentShader: Et, - ...B - }); - return s.onBeforeCompile = V(n), s; - }, [n, t]), v = $(e, r, i, a.Mesh); - return { material: i, mesh: v }; -}, ve = Object.freeze({ - texture: T, - map: T, - alphaMap: !1, - mapIntensity: 0.3, - brightness: new a.Vector3(0.5, 0.5, 0.5), - min: 0, - max: 1, - dodgeColor: !1 -}), er = ({ - size: e, - dpr: t, - samples: n, - isSizeUpdate: r, - uniforms: i, - onBeforeCompile: v -}) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = Lt({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), [y, x] = W({ - scene: u, - camera: f, - size: e, - dpr: s.fbo, - samples: n, - isSizeUpdate: r - }), [o, g] = q(ve), l = A(c), p = z(c), m = D( - (M, h) => { - g(M), p(h); - }, - [g, p] - ); - return [ - D( - (M, h, S) => { - const { gl: _ } = M; - return m(h, 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), x(_); - }, - [x, l, o, m] - ), - m, - { - scene: u, - mesh: d, - material: c, - camera: f, - renderTarget: y, - output: y.texture - } - ]; -}; -var $t = "#usf ", jt = `precision highp float; - -varying vec2 vUv; -uniform vec2 uResolution; -uniform vec2 uTextureResolution; -uniform sampler2D uTexture0; -uniform sampler2D uTexture1; -uniform sampler2D uMap; -uniform float mapIntensity; -uniform float edgeIntensity; -uniform float progress; -uniform float dirX; -uniform float dirY; -uniform vec2 epicenter; -uniform float padding; - -bool isInPaddingArea(vec2 uv) { - return uv.x < padding || uv.x > 1.0 - padding || uv.y < padding || uv.y > 1.0 - padding; -} - -void main() { - #usf - - - vec2 map = texture2D(uMap, uv).rg; - vec2 normalizedMap = map * 2.0 - 1.0; - - - uv = uv * 2.0 - 1.0; - uv *= map * distance(epicenter, uv) * edgeIntensity + 1.0; - uv = (uv + 1.0) / 2.0; - - - if (isInPaddingArea(uv)) { - gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0); - return; - } - vec2 paddedUV = uv * (1.0 - 2.0 * padding * -1.) + padding * -1.; - - - vec2 centeredUV = paddedUV - vec2(0.5); - - - centeredUV *= normalizedMap * map * mapIntensity + 1.0; - - - float xOffsetTexture0 = 0.5 - dirX * progress; - float yOffsetTexture0 = 0.5 - dirY * progress; - vec2 samplePosTexture0 = vec2(xOffsetTexture0, yOffsetTexture0) + centeredUV; - - - float xOffsetTexture1 = 0.5 + dirX * (1.0 - progress); - float yOffsetTexture1 = 0.5 + dirY * (1.0 - progress); - vec2 samplePosTexture1 = vec2(xOffsetTexture1, yOffsetTexture1) + centeredUV; - - vec4 color0 = texture2D(uTexture0, samplePosTexture0); - vec4 color1 = texture2D(uTexture1, samplePosTexture1); - - gl_FragColor = mix(color0, color1, progress); - -}`; -const qt = ({ - scene: e, - size: t, - dpr: n, - uniforms: r, - onBeforeCompile: i -}) => { - const v = b(() => new a.PlaneGeometry(2, 2), []), s = b(() => { - var f, y; - const d = new a.ShaderMaterial({ - uniforms: { - uResolution: { value: new a.Vector2() }, - uTextureResolution: { value: new a.Vector2() }, - uTexture0: { value: T }, - uTexture1: { value: T }, - padding: { value: oe.padding }, - uMap: { value: T }, - edgeIntensity: { value: oe.edgeIntensity }, - mapIntensity: { value: oe.mapIntensity }, - epicenter: { value: oe.epicenter }, - progress: { value: oe.progress }, - dirX: { value: (f = oe.dir) == null ? void 0 : f.x }, - dirY: { value: (y = oe.dir) == null ? void 0 : y.y }, - ...r - }, - vertexShader: $t, - fragmentShader: jt, - ...B - }); - return d.onBeforeCompile = V(i), d; - }, [i, r]), u = Y(t, n); - A(s)("uResolution", u.clone()); - const c = $(e, v, s, a.Mesh); - return { material: s, mesh: c }; -}, oe = Object.freeze({ - texture0: T, - texture1: T, - padding: 0, - map: T, - mapIntensity: 0, - edgeIntensity: 0, - epicenter: new a.Vector2(0, 0), - progress: 0, - dir: new a.Vector2(0, 0) -}), tr = ({ - size: e, - dpr: t, - samples: n, - isSizeUpdate: r, - uniforms: i, - onBeforeCompile: v -}) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = qt({ - scene: u, - size: e, - dpr: s.shader, - uniforms: i, - onBeforeCompile: v - }), f = j(e), [y, x] = W({ - scene: u, - camera: f, - dpr: s.fbo, - size: e, - samples: n, - isSizeUpdate: r - }), [o, g] = q(oe), l = A(c), p = z(c), m = D( - (M, h) => { - g(M), p(h); - }, - [g, p] - ); - return [ - D( - (M, h, S) => { - var F, P, O, k, te, H, K, ie; - const { gl: _ } = M; - m(h, S), l("uTexture0", o.texture0), l("uTexture1", o.texture1), l("progress", o.progress); - const w = [ - ((P = (F = o.texture0) == null ? void 0 : F.image) == null ? void 0 : P.width) || 0, - ((k = (O = o.texture0) == null ? void 0 : O.image) == null ? void 0 : k.height) || 0 - ], I = [ - ((H = (te = o.texture1) == null ? void 0 : te.image) == null ? void 0 : H.width) || 0, - ((ie = (K = o.texture1) == null ? void 0 : K.image) == null ? void 0 : ie.height) || 0 - ], R = w.map((X, xe) => X + (I[xe] - X) * o.progress); - return l("uTextureResolution", R), 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), x(_); - }, - [x, l, o, m] - ), - m, - { - scene: u, - mesh: d, - material: c, - camera: f, - renderTarget: y, - output: y.texture - } - ]; -}; -var Wt = "#usf ", Nt = `precision highp float; - -varying vec2 vUv; -uniform sampler2D u_texture; -uniform vec3 u_brightness; -uniform float u_min; -uniform float u_max; - -void main() { - vec2 uv = vUv; - vec3 color = texture2D(u_texture, uv).rgb; - 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 kt = ({ - scene: e, - uniforms: t, - onBeforeCompile: n -}) => { - const r = b(() => new a.PlaneGeometry(2, 2), []), i = b(() => { - const s = new a.ShaderMaterial({ - uniforms: { - u_texture: { value: T }, - u_brightness: { value: fe.brightness }, - u_min: { value: fe.min }, - u_max: { value: fe.max }, - ...t - }, - vertexShader: Wt, - fragmentShader: Nt, - ...B - }); - return s.onBeforeCompile = V(n), s; - }, [n, t]), v = $(e, r, i, a.Mesh); - return { material: i, mesh: v }; -}, fe = Object.freeze({ - texture: T, - brightness: new a.Vector3(0.5, 0.5, 0.5), - min: 0, - max: 1 -}), nr = ({ - size: e, - dpr: t, - samples: n, - isSizeUpdate: r, - uniforms: i, - onBeforeCompile: v -}) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = kt({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), [y, x] = W({ - scene: u, - camera: f, - size: e, - dpr: s.fbo, - samples: n, - isSizeUpdate: r - }), [o, g] = q( - fe - ), l = A(c), p = z(c), m = D( - (M, h) => { - g(M), p(h); - }, - [g, p] - ); - return [ - D( - (M, h, S) => { - const { gl: _ } = M; - return m(h, S), l("u_texture", o.texture), l("u_brightness", o.brightness), l("u_min", o.min), l("u_max", o.max), x(_); - }, - [x, l, o, m] - ), - m, - { - scene: u, - mesh: d, - material: c, - camera: f, - renderTarget: y, - output: y.texture - } - ]; -}; -var Gt = "#usf ", Kt = `precision highp float; - -varying vec2 vUv; -uniform sampler2D u_texture; -uniform sampler2D uMap; -uniform float uMapIntensity; - -void main() { - vec2 uv = vUv; - - #usf - - gl_FragColor = texture2D(u_texture, uv); -}`; -const Xt = ({ - scene: e, - uniforms: t, - onBeforeCompile: n -}) => { - const r = b(() => new a.PlaneGeometry(2, 2), []), i = b(() => { - const s = new a.ShaderMaterial({ - uniforms: { - u_texture: { value: T }, - uMap: { value: T }, - uMapIntensity: { value: Ve.mapIntensity }, - ...t - }, - vertexShader: Gt, - fragmentShader: Kt, - ...B - }); - return s.onBeforeCompile = V(n), s; - }, [n, t]), v = $(e, r, i, a.Mesh); - return { material: i, mesh: v }; -}, Ve = Object.freeze({ - texture: T, - map: T, - mapIntensity: 0.3 -}), rr = ({ - size: e, - dpr: t, - samples: n, - isSizeUpdate: r, - uniforms: i, - onBeforeCompile: v -}) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = Xt({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), [y, x] = W({ - scene: u, - camera: f, - size: e, - dpr: s.fbo, - samples: n, - isSizeUpdate: r - }), [o, g] = q(Ve), l = A(c), p = z(c), m = D( - (M, h) => { - g(M), p(h); - }, - [g, p] - ); - return [ - D( - (M, h, S) => { - const { gl: _ } = M; - return m(h, S), l("u_texture", o.texture), l("uMap", o.map), l("uMapIntensity", o.mapIntensity), x(_); - }, - [x, l, o, m] - ), - m, - { - scene: u, - mesh: d, - material: c, - camera: f, - renderTarget: y, - output: y.texture - } - ]; -}; -var Ht = "#usf ", Yt = `precision highp float; - -uniform sampler2D uTexture; -uniform sampler2D uMap; - -varying vec2 vUv; - -void main() { - vec2 uv = vUv; - vec4 tex = texture2D(uTexture, uv); - vec4 map = texture2D(uMap, uv); - gl_FragColor = mix(tex,map,map.a); -}`; -const Qt = ({ - scene: e, - uniforms: t, - onBeforeCompile: n -}) => { - const r = b(() => new a.PlaneGeometry(2, 2), []), i = b(() => { - const s = new a.ShaderMaterial({ - uniforms: { - uTexture: { value: T }, - uMap: { value: T }, - ...t - }, - vertexShader: Ht, - fragmentShader: Yt, - ...B - }); - return s.onBeforeCompile = V(n), s; - }, [n, t]), v = $(e, r, i, a.Mesh); - return { material: i, mesh: v }; -}, Zt = Object.freeze({ - texture: T, - map: T -}), or = ({ - size: e, - dpr: t, - samples: n, - isSizeUpdate: r, - uniforms: i, - onBeforeCompile: v -}) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = Qt({ - scene: u, - size: e, - uniforms: i, - onBeforeCompile: v - }), f = j(e), [y, x] = W({ - scene: u, - camera: f, - size: e, - dpr: s.fbo, - samples: n, - isSizeUpdate: r - }), [o, g] = q(Zt), l = A(c), p = z(c), m = D( - (M, h) => { - g(M), p(h); - }, - [g, p] - ); - return [ - D( - (M, h, S) => { - const { gl: _ } = M; - return m(h, S), l("uTexture", o.texture), l("uMap", o.map), x(_); - }, - [l, x, o, m] - ), - m, - { - scene: u, - mesh: d, - material: c, - camera: f, - renderTarget: y, - output: y.texture - } - ]; -}; -var Jt = "#usf ", en = `precision highp float; - -varying vec2 vUv; -uniform sampler2D u_texture; -uniform float u_brightness; -uniform float u_saturation; - -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)); - vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); - - 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); -} - -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); -} - -void main() { - vec4 tex = texture2D(u_texture, vUv); - vec3 hsv = rgb2hsv(tex.rgb); - hsv.y *= u_saturation; - hsv.z *= u_brightness; - vec3 final = hsv2rgb(hsv); - gl_FragColor = vec4(final, tex.a); -}`; -const tn = ({ - scene: e, - uniforms: t, - onBeforeCompile: n -}) => { - const r = b(() => new a.PlaneGeometry(2, 2), []), i = b(() => { - const s = new a.ShaderMaterial({ - uniforms: { - u_texture: { value: T }, - u_brightness: { value: Se.brightness }, - u_saturation: { value: Se.saturation }, - ...t - }, - vertexShader: Jt, - fragmentShader: en, - ...B - }); - return s.onBeforeCompile = V(n), s; - }, [n, t]), v = $(e, r, i, a.Mesh); - return { material: i, mesh: v }; -}, Se = Object.freeze({ - texture: T, - brightness: 1, - saturation: 1 -}), ar = ({ - size: e, - dpr: t, - samples: n, - isSizeUpdate: r, - uniforms: i, - onBeforeCompile: v -}) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = tn({ - scene: u, - size: e, - uniforms: i, - onBeforeCompile: v - }), f = j(e), [y, x] = W({ - scene: u, - camera: f, - size: e, - dpr: s.fbo, - samples: n, - isSizeUpdate: r - }), [o, g] = q(Se), l = A(c), p = z(c), m = D( - (M, h) => { - g(M), p(h); - }, - [g, p] - ); - return [ - D( - (M, h, S) => { - const { gl: _ } = M; - return m(h, S), l("u_texture", o.texture), l("u_brightness", o.brightness), l("u_saturation", o.saturation), x(_); - }, - [l, x, o, m] - ), - m, - { - scene: u, - mesh: d, - material: c, - camera: f, - renderTarget: y, - output: y.texture - } - ]; -}; -var nn = "#usf ", rn = `precision highp float; - -varying vec2 vUv; -uniform vec2 uResolution; -uniform vec2 uTextureResolution; -uniform sampler2D uTexture; - -void main() { - #usf - - gl_FragColor = texture2D(uTexture, uv); -}`; -const on = ({ - scene: e, - size: t, - dpr: n, - uniforms: r, - onBeforeCompile: i -}) => { - const v = b(() => new a.PlaneGeometry(2, 2), []), s = b(() => { - const d = new a.ShaderMaterial({ - uniforms: { - uResolution: { value: new a.Vector2() }, - uTextureResolution: { value: new a.Vector2() }, - uTexture: { value: T }, - ...r - }, - vertexShader: nn, - fragmentShader: rn, - ...B - }); - return d.onBeforeCompile = V(i), d; - }, [i, r]), u = Y(t, n); - A(s)("uResolution", u.clone()); - const c = $(e, v, s, a.Mesh); - return { material: s, mesh: c }; -}, an = Object.freeze({ - texture: T -}), ir = ({ - size: e, - dpr: t, - samples: n, - isSizeUpdate: r, - uniforms: i, - onBeforeCompile: v -}) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = on({ - scene: u, - size: e, - dpr: s.shader, - uniforms: i, - onBeforeCompile: v - }), f = j(e), [y, x] = W({ - scene: u, - camera: f, - dpr: s.fbo, - size: e, - samples: n, - isSizeUpdate: r - }), [o, g] = q(an), l = A(c), p = z(c), m = D( - (M, h) => { - g(M), p(h); - }, - [g, p] - ); - return [ - D( - (M, h, S) => { - var w, I, R, F, P, O; - const { gl: _ } = M; - return m(h, S), l("uTexture", o.texture), l("uTextureResolution", [ - ((R = (I = (w = o.texture) == null ? void 0 : w.source) == null ? void 0 : I.data) == null ? void 0 : R.width) || 0, - ((O = (P = (F = o.texture) == null ? void 0 : F.source) == null ? void 0 : P.data) == null ? void 0 : O.height) || 0 - ]), x(_); - }, - [x, l, o, m] - ), - m, - { - scene: u, - mesh: d, - material: c, - camera: f, - renderTarget: y, - output: y.texture - } - ]; -}; -var un = "#usf ", sn = `precision highp float; - -varying vec2 vUv; -uniform sampler2D uTexture; -uniform vec2 uResolution; -uniform float uBlurSize; - -void main() { - vec2 uv = vUv; - vec2 perDivSize = uBlurSize / uResolution; - - - vec4 outColor = vec4( - texture2D(uTexture, uv + perDivSize * vec2(-1.0, -1.0)) + - texture2D(uTexture, uv + perDivSize * vec2(0.0, -1.0)) + - texture2D(uTexture, uv + perDivSize * vec2(1.0, -1.0)) + - texture2D(uTexture, uv + perDivSize * vec2(-1.0, 0.0)) + - texture2D(uTexture, uv + perDivSize * vec2(0.0, 0.0)) + - texture2D(uTexture, uv + perDivSize * vec2(1.0, 0.0)) + - texture2D(uTexture, uv + perDivSize * vec2(-1.0, 1.0)) + - texture2D(uTexture, uv + perDivSize * vec2(0.0, 1.0)) + - texture2D(uTexture, uv + perDivSize * vec2(1.0, 1.0)) - ) / 9.0; - - gl_FragColor = outColor; -}`; -const ln = ({ - scene: e, - uniforms: t, - onBeforeCompile: n -}) => { - const r = b(() => new a.PlaneGeometry(2, 2), []), i = b(() => { - const s = new a.ShaderMaterial({ - uniforms: { - uTexture: { value: T }, - uResolution: { value: new a.Vector2(0, 0) }, - uBlurSize: { value: ze.blurSize }, - ...t - }, - vertexShader: un, - fragmentShader: sn, - ...B - }); - return s.onBeforeCompile = V(n), s; - }, [n, t]), v = $(e, r, i, a.Mesh); - return { material: i, mesh: v }; -}, ze = Object.freeze({ - texture: T, - blurSize: 3, - blurPower: 5 -}), ur = ({ - size: e, - dpr: t, - samples: n, - isSizeUpdate: r, - uniforms: i, - onBeforeCompile: v -}) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = ln({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), y = b( - () => ({ - scene: u, - camera: f, - size: e, - dpr: s.fbo, - samples: n, - isSizeUpdate: r - }), - [u, f, e, s.fbo, n, r] - ), [x, o] = se(y), [g, l] = q(ze), p = A(c), m = z(c), C = D( - (h, S) => { - l(h), m(S); - }, - [l, m] - ); - return [ - D( - (h, S, _) => { - var F, P, O, k, te, H; - const { gl: w } = h; - C(S, _), p("uTexture", g.texture), p("uResolution", [ - ((O = (P = (F = g.texture) == null ? void 0 : F.source) == null ? void 0 : P.data) == null ? void 0 : O.width) || 0, - ((H = (te = (k = g.texture) == null ? void 0 : k.source) == null ? void 0 : te.data) == null ? void 0 : H.height) || 0 - ]), p("uBlurSize", g.blurSize); - let I = o(w); - const R = g.blurPower; - for (let K = 0; K < R; K++) - p("uTexture", I), I = o(w); - return I; - }, - [o, p, g, C] - ), - C, - { - scene: u, - mesh: d, - material: c, - camera: f, - renderTarget: x, - output: x.read.texture - } - ]; -}; -var cn = "#usf ", vn = `precision highp float; - -varying vec2 vUv; -uniform sampler2D uTexture; -uniform sampler2D uBackbuffer; -uniform vec2 uBegin; -uniform vec2 uEnd; -uniform float uStrength; - -void main() { - vec2 uv = vUv; - vec4 current = texture2D(uTexture, uv + uBegin*.1); - vec4 back = texture2D(uBackbuffer, uv + uEnd*.1); - vec4 mixed = mix(current,back,uStrength); - gl_FragColor = mixed; -}`; -const pn = ({ - scene: e, - uniforms: t, - onBeforeCompile: n -}) => { - const r = b(() => new a.PlaneGeometry(2, 2), []), i = b(() => { - const s = new a.ShaderMaterial({ - uniforms: { - uTexture: { value: T }, - uBackbuffer: { value: T }, - uBegin: { value: de.begin }, - uEnd: { value: de.end }, - uStrength: { value: de.strength }, - ...t - }, - vertexShader: cn, - fragmentShader: vn, - ...B - }); - return s.onBeforeCompile = V(n), s; - }, [n, t]), v = $(e, r, i, a.Mesh); - return { material: i, mesh: v }; -}, de = Object.freeze({ - texture: T, - begin: new a.Vector2(0, 0), - end: new a.Vector2(0, 0), - strength: 0.9 -}), sr = ({ - size: e, - dpr: t, - samples: n, - isSizeUpdate: r, - uniforms: i, - onBeforeCompile: v -}) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = pn({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), y = b( - () => ({ - scene: u, - camera: f, - size: e, - dpr: s.fbo, - samples: n, - isSizeUpdate: r - }), - [u, f, e, s.fbo, n, r] - ), [x, o] = se(y), [g, l] = q(de), p = A(c), m = z(c), C = D( - (h, S) => { - l(h), m(S); - }, - [l, m] - ); - return [ - D( - (h, S, _) => { - const { gl: w } = h; - return C(S, _), p("uTexture", g.texture), p("uBegin", g.begin), p("uEnd", g.end), p("uStrength", g.strength), o(w, ({ read: I }) => { - p("uBackbuffer", I); - }); - }, - [o, p, C, g] - ), - C, - { - scene: u, - mesh: d, - material: c, - camera: f, - renderTarget: x, - output: x.read.texture - } - ]; -}; -var mn = "#usf ", fn = `precision highp float; - -varying vec2 vUv; -uniform float uProgress; -uniform float uStrength; -uniform float uWidth; -uniform vec2 uEpicenter; -uniform int uMode; - -float PI = 3.141592653589; - -void main() { - - vec2 uv = vUv; - - float progress = min(uProgress, 1.0); - float progressFactor = sin(progress * PI); - - float border = progress - progress * progressFactor * uWidth; - float blur = uStrength * progressFactor; - - - vec2 normalizeCenter = (uEpicenter + 1.0) / 2.0; - - - float dist = uMode == 0 ? length(uv - normalizeCenter) : uMode == 1 ? length(uv.x - normalizeCenter.x) : length(uv.y - normalizeCenter.y); - - - float maxDistance = max( - length(vec2(0.0, 0.0) - normalizeCenter), - max( - length(vec2(1.0, 0.0) - normalizeCenter), - max( - length(vec2(0.0, 1.0) - normalizeCenter), - length(vec2(1.0, 1.0) - normalizeCenter) - ) - ) - ); - - - dist = maxDistance > 0.0 ? dist / maxDistance : dist; - - vec3 color = vec3(smoothstep(border - blur, border, dist) - - smoothstep(progress, progress + blur, dist)); - - - color *= progressFactor; - - gl_FragColor = vec4(color, 1.0); -}`; -const dn = ({ - scene: e, - uniforms: t, - onBeforeCompile: n -}) => { - const r = b(() => new a.PlaneGeometry(2, 2), []), i = b(() => { - const s = new a.ShaderMaterial({ - uniforms: { - uEpicenter: { value: pe.epicenter }, - uProgress: { value: pe.progress }, - uStrength: { value: pe.strength }, - uWidth: { value: pe.width }, - uMode: { value: 0 }, - ...t - }, - vertexShader: mn, - fragmentShader: fn, - ...B - }); - return s.onBeforeCompile = V(n), s; - }, [n, t]), v = $(e, r, i, a.Mesh); - return { material: i, mesh: v }; -}, pe = Object.freeze({ - epicenter: new a.Vector2(0, 0), - progress: 0, - width: 0, - strength: 0, - mode: "center" -}), lr = ({ - size: e, - dpr: t, - samples: n, - isSizeUpdate: r, - uniforms: i, - onBeforeCompile: v -}) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = dn({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), [y, x] = W({ - scene: u, - camera: f, - size: e, - dpr: s.fbo, - samples: n, - isSizeUpdate: r - }), [o, g] = q(pe), l = A(c), p = z(c), m = D( - (M, h) => { - g(M), p(h); - }, - [g, p] - ); - return [ - D( - (M, h, S) => { - const { gl: _ } = M; - return m(h, 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 - ), x(_); - }, - [x, l, o, m] - ), - m, - { - scene: u, - mesh: d, - material: c, - camera: f, - renderTarget: y, - output: y.texture - } - ]; -}; -var gn = "#usf ", hn = `precision highp float; -varying vec2 vUv; - -uniform sampler2D u_texture; -uniform vec2 u_resolution; -uniform vec3 u_keyColor; -uniform float u_similarity; -uniform float u_smoothness; -uniform float u_spill; - -uniform vec4 u_color; -uniform float u_contrast; -uniform float u_brightness; -uniform float u_gamma; - -vec2 RGBtoUV(vec3 rgb) { - return vec2( - rgb.r * -0.169 + rgb.g * -0.331 + rgb.b * 0.5 + 0.5, - rgb.r * 0.5 + rgb.g * -0.419 + rgb.b * -0.081 + 0.5 - ); -} -float getChromeDist(vec3 texColor){ - float chromaDist = distance(RGBtoUV(texColor), RGBtoUV(u_keyColor)); - return chromaDist; -} - -float getBoxFilteredChromaDist(vec3 rgb, vec2 uv) -{ - vec2 pixel_size = vec2(1.) / u_resolution; - vec2 h_pixel_size = pixel_size / 2.0; - vec2 point_0 = vec2(pixel_size.x, h_pixel_size.y); - vec2 point_1 = vec2(h_pixel_size.x, -pixel_size.y); - float distVal = getChromeDist(texture2D(u_texture,uv-point_0).rgb); - distVal += getChromeDist(texture2D(u_texture,uv+point_0).rgb); - distVal += getChromeDist(texture2D(u_texture,uv-point_1).rgb); - distVal += getChromeDist(texture2D(u_texture,uv+point_1).rgb); - distVal *= 2.0; - distVal += getChromeDist(rgb); - return distVal / 9.0; -} - -vec4 CalcColor(vec4 rgba) -{ - return vec4(pow(rgba.rgb, vec3(u_gamma, u_gamma, u_gamma)) * u_contrast + u_brightness, rgba.a); -} - -void main() { - - vec2 uv = vUv; - - vec4 texColor = texture2D(u_texture, uv); - texColor.rgb *= (texColor.a > 0.) ? (1. / texColor.a) : 0.; - - float chromaDist = getBoxFilteredChromaDist(texColor.rgb,uv); - - float baseMask = chromaDist - u_similarity; - float fullMask = pow(clamp(baseMask / u_smoothness, 0., 1.), 1.5); - - texColor.rgba *= u_color; - texColor.a = fullMask; - - float spillVal = pow(clamp(baseMask / u_spill, 0., 1.), 1.5); - float desat = clamp(texColor.r * 0.2126 + texColor.g * 0.7152 + texColor.b * 0.0722, 0., 1.); - texColor.rgb = mix(vec3(desat, desat, desat), texColor.rgb, spillVal); - - vec4 finColor = CalcColor(texColor); - - gl_FragColor = finColor; -}`; -const xn = ({ - scene: e, - size: t, - dpr: n, - uniforms: r, - onBeforeCompile: i -}) => { - const v = b(() => new a.PlaneGeometry(2, 2), []), s = b(() => { - const d = new a.ShaderMaterial({ - uniforms: { - u_texture: { value: T }, - u_resolution: { value: new a.Vector2() }, - u_keyColor: { value: J.color }, - u_similarity: { value: J.similarity }, - u_smoothness: { value: J.smoothness }, - u_spill: { value: J.spill }, - u_color: { value: J.color }, - u_contrast: { value: J.contrast }, - u_brightness: { value: J.brightness }, - u_gamma: { value: J.gamma }, - ...r - }, - vertexShader: gn, - fragmentShader: hn, - ...B - }); - return d.onBeforeCompile = V(i), d; - }, [i, r]), u = Y(t, n); - A(s)("u_resolution", u.clone()); - const c = $(e, v, s, a.Mesh); - return { material: s, mesh: c }; -}, J = Object.freeze({ - texture: T, - keyColor: new a.Color(65280), - similarity: 0.2, - smoothness: 0.1, - spill: 0.2, - color: new a.Vector4(1, 1, 1, 1), - contrast: 1, - brightness: 0, - gamma: 1 -}), cr = ({ - size: e, - dpr: t, - samples: n, - isSizeUpdate: r, - uniforms: i, - onBeforeCompile: v -}) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = xn({ - scene: u, - size: e, - dpr: s.shader, - uniforms: i, - onBeforeCompile: v - }), f = j(e), [y, x] = W({ - scene: u, - camera: f, - size: e, - dpr: s.fbo, - samples: n, - isSizeUpdate: r - }), [o, g] = q(J), l = A(c), p = z(c), m = D( - (M, h) => { - g(M), p(h); - }, - [g, p] - ); - return [ - D( - (M, h, S) => { - const { gl: _ } = M; - return m(h, 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), x(_); - }, - [x, l, o, m] - ), - m, - { - scene: u, - mesh: d, - material: c, - camera: f, - renderTarget: y, - output: y.texture - } - ]; -}; -var yn = `precision highp float; - -varying vec2 vUv; -#usf - -#usf - -void main() { - vec4 usf_Position = vec4(position,1.); - vUv = uv; - - #usf
- - gl_Position = usf_Position; -}`, bn = `precision highp float; - -varying vec2 vUv; -#usf - -uniform sampler2D uTexture; -uniform sampler2D uBackbuffer; -uniform float uTime; -uniform vec2 uPointer; -uniform vec2 uResolution; - -#usf - -void main() { - vec4 usf_FragColor = vec4(1.); - - #usf
- - gl_FragColor = usf_FragColor; -}`; -const Mn = ({ - scene: e, - size: t, - dpr: n, - uniforms: r, - onBeforeCompile: i -}) => { - const v = b(() => new a.PlaneGeometry(2, 2), []), s = b(() => { - const d = new a.ShaderMaterial({ - uniforms: { - uTexture: { value: T }, - uBackbuffer: { value: T }, - uTime: { value: 0 }, - uPointer: { value: new a.Vector2() }, - uResolution: { value: new a.Vector2() }, - ...r - }, - vertexShader: yn, - fragmentShader: bn, - ...B - }); - return d.onBeforeCompile = V(i), d; - }, [i, r]), u = Y(t, n); - A(s)("uResolution", u.clone()); - const c = $(e, v, s, a.Mesh); - return { material: s, mesh: c }; -}, Sn = Object.freeze({ - texture: T, - beat: !1 -}), vr = ({ - size: e, - dpr: t, - samples: n, - isSizeUpdate: r, - uniforms: i, - onBeforeCompile: v -}) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = Mn({ - scene: u, - size: e, - dpr: s.shader, - uniforms: i, - onBeforeCompile: v - }), f = j(e), y = b( - () => ({ - scene: u, - camera: f, - size: e, - dpr: s.fbo, - samples: n, - isSizeUpdate: r - }), - [u, f, e, s.fbo, n, r] - ), [x, o] = se(y), [g, l] = q(Sn), p = A(c), m = z(c), C = D( - (h, S) => { - l(h), m(S); - }, - [l, m] - ); - return [ - D( - (h, S, _) => { - const { gl: w, clock: I, pointer: R } = h; - return C(S, _), p("uPointer", R), p("uTexture", g.texture), p("uTime", g.beat || I.getElapsedTime()), o(w, ({ read: F }) => { - p("uBackbuffer", F); - }); - }, - [o, p, g, C] - ), - C, - { - scene: u, - mesh: d, - material: c, - camera: f, - renderTarget: x, - output: x.read.texture - } - ]; -}, _n = ({ - scene: e, - geometry: t, - material: n -}) => { - const r = $( - e, - t, - n, - a.Points - ), i = $( - e, - b(() => t.clone(), [t]), - b(() => n.clone(), [n]), - a.Mesh - ); - return i.visible = !1, { - points: r, - interactiveMesh: i - }; -}; -var Cn = `uniform vec2 uResolution; -uniform float uMorphProgress; -uniform float uPointSize; - -uniform sampler2D uPicture; -uniform bool uIsPicture; -uniform sampler2D uAlphaPicture; -uniform bool uIsAlphaPicture; - -uniform vec3 uColor0; -uniform vec3 uColor1; -uniform vec3 uColor2; -uniform vec3 uColor3; - -uniform float uTime; - -uniform float uWobblePositionFrequency; -uniform float uWobbleTimeFrequency; -uniform float uWobbleStrength; -uniform float uWarpPositionFrequency; -uniform float uWarpTimeFrequency; -uniform float uWarpStrength; - -uniform sampler2D uDisplacement; -uniform bool uIsDisplacement; -uniform float uDisplacementIntensity; - -uniform float uSizeRandomIntensity; -uniform float uSizeRandomTimeFrequency; -uniform float uSizeRandomMin; -uniform float uSizeRandomMax; - -uniform float uMapArrayLength; - -uniform float uDivergence; -uniform vec3 uDivergencePoint; - -varying vec3 vColor; -varying float vPictureAlpha; -varying vec3 vDisplacementColor; -varying float vDisplacementIntensity; -varying float vMapArrayIndex; - -#usf - -#usf - -#usf - -float random3D(vec3 co) { - return fract(sin(dot(co.xyz ,vec3(12.9898, 78.233, 45.764))) * 43758.5453); -} - -void main() { - vec3 newPosition = position; - vec2 newUv = uv; - - #usf - #usf - - - vec3 displacement = uIsDisplacement ? texture2D(uDisplacement, newUv).rgb : vec3(0.0); - float displacementIntensity = smoothstep(0., 1., displacement.g); - vDisplacementColor = displacement; - vDisplacementIntensity = displacementIntensity; - - - displacement = displacement * 2.-1.; - displacement *= displacementIntensity * uDisplacementIntensity; - newPosition += displacement; - - - vec3 divergenceDir = newPosition - uDivergencePoint; - if (uDivergence > 0.0) { - newPosition += normalize(divergenceDir) * uDivergence; - } else if (uDivergence < 0.0) { - newPosition -= normalize(divergenceDir) * abs(uDivergence); - } - - - vec4 modelPosition = modelMatrix * vec4(newPosition, 1.0); - vec4 viewPosition = viewMatrix * modelPosition; - vec4 projectedPosition = projectionMatrix * viewPosition; - - - float wobble = uWobbleStrength > 0. ? getWobble(projectedPosition.xyz) : 0.0; - - gl_Position = projectedPosition += wobble; - - - vColor = uIsPicture ? texture2D(uPicture, newUv).rgb : mix(mix(uColor0, uColor1, newPosition.x), mix(uColor2, uColor3, newPosition.y), newPosition.z); - - - vPictureAlpha = uIsAlphaPicture ? texture2D(uAlphaPicture, newUv).g : 1.; - - - - float sizeRand = uSizeRandomIntensity > 0. ? mix(uSizeRandomMin,uSizeRandomMax,(simplexNoise4d(vec4(newPosition,uTime * uSizeRandomTimeFrequency))*.5+.5)) * uSizeRandomIntensity : 1.; - gl_PointSize = uPointSize * vPictureAlpha * uResolution.y * sizeRand; - gl_PointSize *= (1.0 / - viewPosition.z); - - - vMapArrayIndex = uMapArrayLength > 0. ? floor(random3D(position) * uMapArrayLength) : 0.; -}`, wn = `precision highp float; -precision highp int; - -varying vec3 vColor; -varying float vPictureAlpha; -varying vec3 vDisplacementColor; -varying float vDisplacementIntensity; -varying float vMapArrayIndex; - -uniform float uBlurAlpha; -uniform float uBlurRadius; -uniform sampler2D uMap; -uniform bool uIsMap; -uniform sampler2D uAlphaMap; -uniform bool uIsAlphaMap; -uniform float uDisplacementColorIntensity; -uniform float uPointAlpha; - -#usf - -void main() { - vec2 uv = gl_PointCoord; - uv.y = 1.0 - uv.y; - - - float distanceToCenter = length(uv - .5); - float alpha = clamp(uBlurRadius / distanceToCenter - (1.-uBlurAlpha) , 0. , 1.); - - - vec4 mapArrayColor; - #usf - vec4 mapColor = isMapArray ? mapArrayColor : uIsMap ? texture2D(uMap,uv) : vec4(1.); - vec3 finalColor = isMapArray || uIsMap ? mapColor.rgb : vColor; - - - float mixIntensity = clamp(uDisplacementColorIntensity * vDisplacementIntensity,0.,1.); - finalColor = vDisplacementIntensity > 0. ? mix(finalColor,vDisplacementColor,mixIntensity) : finalColor; - - - float alphaMap = uIsAlphaMap ? texture2D(uAlphaMap,uv).g : 1.; - - gl_FragColor = vec4(finalColor,alpha * vPictureAlpha * alphaMap * mapColor.a * uPointAlpha); -}`; -const Pe = (e, t, n, r, i) => { - var f; - const v = n === "position" ? "positionTarget" : "uvTarget", s = n === "position" ? "#usf " : "#usf ", u = n === "position" ? "#usf " : "#usf ", c = n === "position" ? "positionsList" : "uvsList", d = n === "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) { - t.deleteAttribute(n), t.setAttribute( - n, - new a.BufferAttribute(e[0], i) - ); - let y = "", x = ""; - e.forEach((o, g) => { - t.setAttribute( - `${v}${g}`, - new a.BufferAttribute(o, i) - ), y += `attribute vec${i} ${v}${g}; -`, g === 0 ? x += `${v}${g}` : x += `,${v}${g}`; - }), r = r.replace( - `${s}`, - y - ), r = r.replace( - `${u}`, - `vec${i} ${c}[${e.length}] = vec${i}[](${x}); - ${d} - ` - ); - } else - r = r.replace(`${s}`, ""), r = r.replace(`${u}`, ""), (f = t == null ? void 0 : t.attributes[n]) != null && f.array || Ie && console.error( - `use-shader-fx:geometry.attributes.${n}.array is not found` - ); - return r; -}, Re = (e, t, n, r) => { - var v; - let i = []; - if (e && e.length > 0) { - (v = t == null ? void 0 : t.attributes[n]) != null && v.array ? i = [ - t.attributes[n].array, - ...e - ] : i = e; - const s = Math.max(...i.map((u) => u.length)); - i.forEach((u, c) => { - if (u.length < s) { - const d = (s - u.length) / r, f = [], y = Array.from(u); - for (let x = 0; x < d; x++) { - const o = Math.floor(u.length / r * Math.random()) * r; - for (let g = 0; g < r; g++) - f.push(y[o + g]); - } - i[c] = new Float32Array([...y, ...f]); - } - }); - } - return i; -}, Tn = (e, t) => { - let n = ""; - const r = {}; - let i = "mapArrayColor = "; - return e && e.length > 0 ? (e.forEach((s, u) => { - const c = `vMapArrayIndex < ${u}.1`, d = `texture2D(uMapArray${u}, uv)`; - i += `( ${c} ) ? ${d} : `, n += ` - uniform sampler2D uMapArray${u}; - `, r[`uMapArray${u}`] = { value: s }; - }), i += "vec4(1.);", n += "bool isMapArray = true;", r.uMapArrayLength = { value: e.length }) : (i += "vec4(1.0);", n += "bool isMapArray = false;", r.uMapArrayLength = { value: 0 }), { rewritedFragmentShader: t.replace("#usf ", i).replace("#usf ", n), mapArrayUniforms: r }; -}, Dn = ({ - size: e, - dpr: t, - geometry: n, - positions: r, - uvs: i, - mapArray: v, - uniforms: s, - onBeforeCompile: u -}) => { - const c = b( - () => Re(r, n, "position", 3), - [r, n] - ), d = b( - () => Re(i, n, "uv", 2), - [i, n] - ), f = b(() => { - c.length !== d.length && Ie && console.log("use-shader-fx:positions and uvs are not matched"); - const x = Pe( - d, - n, - "uv", - Pe( - c, - n, - "position", - Cn, - 3 - ), - 2 - ), { rewritedFragmentShader: o, mapArrayUniforms: g } = Tn(v, wn), l = new a.ShaderMaterial({ - vertexShader: x, - fragmentShader: o, - blending: a.AdditiveBlending, - ...B, - // Must be transparent - transparent: !0, - 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: T }, - uIsPicture: { value: !1 }, - uAlphaPicture: { value: T }, - uIsAlphaPicture: { value: !1 }, - uColor0: { value: E.color0 }, - uColor1: { value: E.color1 }, - uColor2: { value: E.color2 }, - uColor3: { value: E.color3 }, - uMap: { value: T }, - uIsMap: { value: !1 }, - uAlphaMap: { value: T }, - 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: T }, - 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 }, - ...g, - ...s - } - }); - return l.onBeforeCompile = V(u), l; - }, [ - n, - c, - d, - v, - u, - s - ]), y = Y(e, t); - return A(f)("uResolution", y.clone()), { material: f, modifiedPositions: c, modifiedUvs: d }; -}, Pn = ({ - size: e, - dpr: t, - scene: n = !1, - geometry: r, - positions: i, - uvs: v, - mapArray: s, - uniforms: u, - onBeforeCompile: c -}) => { - const d = U(t), f = b(() => { - const M = r || new a.SphereGeometry(1, 32, 32); - return M.setIndex(null), M.deleteAttribute("normal"), M; - }, [r]), { material: y, modifiedPositions: x, modifiedUvs: o } = Dn({ - size: e, - dpr: d.shader, - geometry: f, - positions: i, - uvs: v, - mapArray: s, - uniforms: u, - onBeforeCompile: c - }), { points: g, interactiveMesh: l } = _n({ - scene: n, - geometry: f, - material: y - }), p = A(y), m = z(y); - return [ - D( - (M, h, S) => { - M && p( - "uTime", - (h == null ? void 0 : h.beat) || M.clock.getElapsedTime() - ), h !== void 0 && (p("uMorphProgress", h.morphProgress), p("uBlurAlpha", h.blurAlpha), p("uBlurRadius", h.blurRadius), p("uPointSize", h.pointSize), p("uPointAlpha", h.pointAlpha), h.picture ? (p("uPicture", h.picture), p("uIsPicture", !0)) : h.picture === !1 && p("uIsPicture", !1), h.alphaPicture ? (p("uAlphaPicture", h.alphaPicture), p("uIsAlphaPicture", !0)) : h.alphaPicture === !1 && p("uIsAlphaPicture", !1), p("uColor0", h.color0), p("uColor1", h.color1), p("uColor2", h.color2), p("uColor3", h.color3), h.map ? (p("uMap", h.map), p("uIsMap", !0)) : h.map === !1 && p("uIsMap", !1), h.alphaMap ? (p("uAlphaMap", h.alphaMap), p("uIsAlphaMap", !0)) : h.alphaMap === !1 && p("uIsAlphaMap", !1), p("uWobbleStrength", h.wobbleStrength), p( - "uWobblePositionFrequency", - h.wobblePositionFrequency - ), p("uWobbleTimeFrequency", h.wobbleTimeFrequency), p("uWarpStrength", h.warpStrength), p("uWarpPositionFrequency", h.warpPositionFrequency), p("uWarpTimeFrequency", h.warpTimeFrequency), h.displacement ? (p("uDisplacement", h.displacement), p("uIsDisplacement", !0)) : h.displacement === !1 && p("uIsDisplacement", !1), p("uDisplacementIntensity", h.displacementIntensity), p( - "uDisplacementColorIntensity", - h.displacementColorIntensity - ), p("uSizeRandomIntensity", h.sizeRandomIntensity), p( - "uSizeRandomTimeFrequency", - h.sizeRandomTimeFrequency - ), p("uSizeRandomMin", h.sizeRandomMin), p("uSizeRandomMax", h.sizeRandomMax), p("uDivergence", h.divergence), p("uDivergencePoint", h.divergencePoint), m(S)); - }, - [p, m] - ), - { - points: g, - interactiveMesh: l, - positions: x, - uvs: o - } - ]; -}, E = Object.freeze({ - morphProgress: 0, - blurAlpha: 0.9, - blurRadius: 0.05, - pointSize: 0.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: 0.5, - wobbleTimeFrequency: 0.5, - warpStrength: 0, - warpPositionFrequency: 0.5, - warpTimeFrequency: 0.5, - displacement: !1, - displacementIntensity: 1, - displacementColorIntensity: 0, - sizeRandomIntensity: 0, - sizeRandomTimeFrequency: 0.2, - sizeRandomMin: 0.5, - sizeRandomMax: 1.5, - divergence: 0, - divergencePoint: new a.Vector3(0), - beat: !1 -}), pr = ({ - size: e, - dpr: t, - samples: n, - isSizeUpdate: r, - camera: i, - geometry: v, - positions: s, - uvs: u, - uniforms: c, - onBeforeCompile: d -}) => { - const f = U(t), y = b(() => new a.Scene(), []), [ - x, - { - points: o, - interactiveMesh: g, - positions: l, - uvs: p - } - ] = Pn({ - scene: y, - size: e, - dpr: t, - geometry: v, - positions: s, - uvs: u, - uniforms: c, - onBeforeCompile: d - }), [m, C] = W({ - scene: y, - camera: i, - size: e, - dpr: f.fbo, - samples: n, - isSizeUpdate: r, - depthBuffer: !0 - }), M = D( - (S, _, w) => (x(S, _, w), C(S.gl)), - [C, x] - ), h = D( - (S, _) => { - x(null, S, _); - }, - [x] - ); - return [ - M, - h, - { - scene: y, - points: o, - interactiveMesh: g, - renderTarget: m, - output: m.texture, - positions: l, - uvs: p - } - ]; -}; -function Rn(e, t = 1e-4) { - t = Math.max(t, Number.EPSILON); - const n = {}, r = e.getIndex(), i = e.getAttribute("position"), v = r ? r.count : i.count; - let s = 0; - const u = Object.keys(e.attributes), c = {}, d = {}, f = [], y = ["getX", "getY", "getZ", "getW"]; - for (let l = 0, p = u.length; l < p; l++) { - const m = u[l]; - c[m] = []; - const C = e.morphAttributes[m]; - C && (d[m] = new Array(C.length).fill(0).map(() => [])); - } - const x = Math.log10(1 / t), o = Math.pow(10, x); - for (let l = 0; l < v; l++) { - const p = r ? r.getX(l) : l; - let m = ""; - for (let C = 0, M = u.length; C < M; C++) { - const h = u[C], S = e.getAttribute(h), _ = S.itemSize; - for (let w = 0; w < _; w++) - m += `${~~(S[y[w]](p) * o)},`; - } - if (m in n) - f.push(n[m]); - else { - for (let C = 0, M = u.length; C < M; C++) { - const h = u[C], S = e.getAttribute(h), _ = e.morphAttributes[h], w = S.itemSize, I = c[h], R = d[h]; - for (let F = 0; F < w; F++) { - const P = y[F]; - if (I.push(S[P](p)), _) - for (let O = 0, k = _.length; O < k; O++) - R[O].push(_[O][P](p)); - } - } - n[m] = s, f.push(s), s++; - } - } - const g = e.clone(); - for (let l = 0, p = u.length; l < p; l++) { - const m = u[l], C = e.getAttribute(m), M = new C.array.constructor(c[m]), h = new De(M, C.itemSize, C.normalized); - if (g.setAttribute(m, h), m in d) - for (let S = 0; S < d[m].length; S++) { - const _ = e.morphAttributes[m][S], w = new _.array.constructor(d[m][S]), I = new De(w, _.itemSize, _.normalized); - g.morphAttributes[m][S] = I; - } - } - return g.setIndex(f), g; -} -var An = `#ifdef USE_TRANSMISSION - - - - - uniform float _transmission; - uniform float thickness; - uniform float attenuationDistance; - uniform vec3 attenuationColor; - - #ifdef USE_TRANSMISSIONMAP - - uniform sampler2D transmissionMap; - - #endif - - #ifdef USE_THICKNESSMAP - - uniform sampler2D thicknessMap; - - #endif - - uniform vec2 transmissionSamplerSize; - uniform sampler2D transmissionSamplerMap; - - uniform mat4 modelMatrix; - uniform mat4 projectionMatrix; - - varying vec3 vWorldPosition; - - - - - float w0( float a ) { - - return ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 ); - - } - - float w1( float a ) { - - return ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 ); - - } - - float w2( float a ){ - - return ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 ); - - } - - float w3( float a ) { - - return ( 1.0 / 6.0 ) * ( a * a * a ); - - } - - - float g0( float a ) { - - return w0( a ) + w1( a ); - - } - - float g1( float a ) { - - return w2( a ) + w3( a ); - - } - - - float h0( float a ) { - - return - 1.0 + w1( a ) / ( w0( a ) + w1( a ) ); - - } - - float h1( float a ) { - - return 1.0 + w3( a ) / ( w2( a ) + w3( a ) ); - - } - - vec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) { - - uv = uv * texelSize.zw + 0.5; - - vec2 iuv = floor( uv ); - vec2 fuv = fract( uv ); - - float g0x = g0( fuv.x ); - float g1x = g1( fuv.x ); - float h0x = h0( fuv.x ); - float h1x = h1( fuv.x ); - float h0y = h0( fuv.y ); - float h1y = h1( fuv.y ); - - vec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy; - vec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy; - vec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy; - vec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy; - - return g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) + - g1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) ); - - } - - vec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) { - - vec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) ); - vec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) ); - vec2 fLodSizeInv = 1.0 / fLodSize; - vec2 cLodSizeInv = 1.0 / cLodSize; - vec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) ); - vec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) ); - return mix( fSample, cSample, fract( lod ) ); - - } - - vec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) { - - - vec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior ); - - - vec3 modelScale; - modelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) ); - modelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) ); - modelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) ); - - - return normalize( refractionVector ) * thickness * modelScale; - - } - - float applyIorToRoughness( const in float roughness, const in float ior ) { - - - - return roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 ); - - } - - vec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) { - - float lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior ); - return textureBicubic( transmissionSamplerMap, fragCoord.xy, lod ); - - } - - vec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) { - - if ( isinf( attenuationDistance ) ) { - - - return vec3( 1.0 ); - - } else { - - - vec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance; - vec3 transmittance = exp( - attenuationCoefficient * transmissionDistance ); - return transmittance; - - } - - } - - vec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor, - const in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix, - const in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness, - const in vec3 attenuationColor, const in float attenuationDistance ) { - - vec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix ); - vec3 refractedRayExit = position + transmissionRay; - - - vec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 ); - vec2 refractionCoords = ndcPos.xy / ndcPos.w; - refractionCoords += 1.0; - refractionCoords /= 2.0; - - - vec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior ); - - vec3 transmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance ); - vec3 attenuatedColor = transmittance * transmittedLight.rgb; - - - vec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness ); - - - - float transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0; - - return vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor ); - - } -#endif`, In = `#ifdef USE_TRANSMISSION - -material.transmission = _transmission; -material.transmissionAlpha = 1.0; -material.thickness = thickness; -material.attenuationDistance = attenuationDistance; -material.attenuationColor = attenuationColor; - -#ifdef USE_TRANSMISSIONMAP - - material.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r; - -#endif - -#ifdef USE_THICKNESSMAP - - material.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g; - -#endif - -vec3 pos = vWorldPosition; - -vec3 v = normalize( cameraPosition - pos ); -vec3 n = inverseTransformDirection( normal, viewMatrix ); - -vec4 transmitted = getIBLVolumeRefraction( - n, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90, - pos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness, - material.attenuationColor, material.attenuationDistance ); - -material.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission ); - -float runningSeed = 0.0; -vec3 transmission = vec3(0.0); -float transmissionR, transmissionB, transmissionG; -float randomCoords = rand(runningSeed++); -float thickness_smear = thickness * max(pow(roughnessFactor, 0.33), uAnisotropicBlur); -vec3 distortionNormal = vec3(0.0); -vec3 temporalOffset = vec3(uTime, -uTime, -uTime) * uTemporalDistortion; - -if (uDistortion > 0.0) { - distortionNormal = uDistortion * vec3(snoiseFractal(vec3((pos * uDistortionScale + temporalOffset))), snoiseFractal(vec3(pos.zxy * uDistortionScale - temporalOffset)), snoiseFractal(vec3(pos.yxz * uDistortionScale + temporalOffset))); -} - -for (float i = 0.0; i < uRefractionSamples; i ++) { - vec3 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); - - transmissionR = getIBLVolumeRefraction( - sampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90, - pos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness + thickness_smear * (i + randomCoords) / uRefractionSamples, - material.attenuationColor, material.attenuationDistance - ).r; - transmissionG = getIBLVolumeRefraction( - sampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90, - pos, modelMatrix, viewMatrix, projectionMatrix, material.ior * (1.0 + uChromaticAberration * (i + randomCoords) / uRefractionSamples) , material.thickness + thickness_smear * (i + randomCoords) / uRefractionSamples, - material.attenuationColor, material.attenuationDistance - ).g; - transmissionB = getIBLVolumeRefraction( - sampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90, - pos, modelMatrix, viewMatrix, projectionMatrix, material.ior * (1.0 + 2.0 * uChromaticAberration * (i + randomCoords) / uRefractionSamples), material.thickness + thickness_smear * (i + randomCoords) / uRefractionSamples, - material.attenuationColor, material.attenuationDistance - ).b; - transmission.r += transmissionR; - transmission.g += transmissionG; - transmission.b += transmissionB; -} - -transmission /= uRefractionSamples; - -totalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission ); - -#endif`; -const Ae = (e) => { - let t = e; - return t = t.replace( - "#include ", - ` - vec3 objectNormal = usf_Normal; - #ifdef USE_TANGENT - vec3 objectTangent = vec3( tangent.xyz ); - #endif` - ), t = t.replace( - "#include ", - ` - vec3 transformed = usf_Position;` - ), t = t.replace( - "void main() {", - ` - uniform float uTime; - uniform float uWobblePositionFrequency; - uniform float uWobbleTimeFrequency; - uniform float uWobbleStrength; - uniform float uWarpPositionFrequency; - uniform float uWarpTimeFrequency; - uniform float uWarpStrength; - attribute vec4 tangent; - varying float vWobble; - varying vec2 vPosition; - // edge - varying vec3 vEdgeNormal; - varying vec3 vEdgeViewPosition; - #usf - void main() { - ` - ), t = t.replace( - "void main() {", - ` - void main() { - vec3 usf_Position = position; - vec3 usf_Normal = normal; - vec3 biTangent = cross(normal, tangent.xyz); - - // Neighbours positions - float shift = 0.01; - vec3 positionA = usf_Position + tangent.xyz * shift; - vec3 positionB = usf_Position + biTangent * shift; - - // wobble - float wobble = (uWobbleStrength > 0.) ? getWobble(usf_Position) : 0.0; - float wobblePositionA = (uWobbleStrength > 0.) ? getWobble(positionA) : 0.0; - float wobblePositionB = (uWobbleStrength > 0.) ? getWobble(positionB) : 0.0; - - usf_Position += wobble * normal; - positionA += wobblePositionA * normal; - positionB += wobblePositionB * normal; - - // Compute normal - vec3 toA = normalize(positionA - usf_Position); - vec3 toB = normalize(positionB - usf_Position); - usf_Normal = cross(toA, toB); - - // Varying - vPosition = usf_Position.xy; - vWobble = wobble/uWobbleStrength; - - vEdgeNormal = normalize(normalMatrix * usf_Normal); - vec4 viewPosition = viewMatrix * modelMatrix * vec4(usf_Position, 1.0); - vEdgeViewPosition = normalize(viewPosition.xyz); - ` - ), t; -}, Fn = ({ - baseMaterial: e, - materialParameters: t, - onBeforeCompile: n, - depthOnBeforeCompile: r, - isCustomTransmission: i = !1, - uniforms: v -}) => { - const { material: s, depthMaterial: u } = b(() => { - const c = new (e || a.MeshPhysicalMaterial)( - t || {} - ); - Object.assign(c.userData, { - uniforms: { - uTime: { value: 0 }, - uWobblePositionFrequency: { - value: N.wobblePositionFrequency - }, - uWobbleTimeFrequency: { - value: N.wobbleTimeFrequency - }, - uWobbleStrength: { value: N.wobbleStrength }, - uWarpPositionFrequency: { - value: N.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 }, - uChromaticAberration: { - value: N.chromaticAberration - }, - uAnisotropicBlur: { value: N.anisotropicBlur }, - uDistortion: { value: N.distortion }, - uDistortionScale: { value: N.distortionScale }, - uTemporalDistortion: { value: N.temporalDistortion }, - uRefractionSamples: { value: N.refractionSamples }, - transmission: { value: 0 }, - _transmission: { value: 1 }, - transmissionMap: { value: null }, - ...v - } - }), c.onBeforeCompile = (f, y) => { - Object.assign(f.uniforms, c.userData.uniforms), f.vertexShader = Ae(f.vertexShader), f.fragmentShader = f.fragmentShader.replace( - "#include ", - ` - #include - - if (uEdgeThreshold > 0.0) { - float edgeThreshold = dot(vEdgeNormal, -vEdgeViewPosition); - diffuseColor = edgeThreshold < uEdgeThreshold ? vec4(uEdgeColor, 1.0) : mix(diffuseColor, usf_DiffuseColor, uColorMix); - } else { - diffuseColor = mix(diffuseColor, usf_DiffuseColor, uColorMix); - } - ` - ), f.fragmentShader = f.fragmentShader.replace( - "void main() {", - ` - uniform vec3 uColor0; - uniform vec3 uColor1; - uniform vec3 uColor2; - uniform vec3 uColor3; - uniform float uColorMix; - uniform float uEdgeThreshold; - uniform vec3 uEdgeColor; - - // transmission - uniform float uChromaticAberration; - uniform float uAnisotropicBlur; - uniform float uTime; - uniform float uDistortion; - uniform float uDistortionScale; - uniform float uTemporalDistortion; - uniform float uRefractionSamples; - - float rand(float n){return fract(sin(n) * 43758.5453123);} - #usf - - varying float vWobble; - varying vec2 vPosition; - varying vec3 vEdgeNormal; - varying vec3 vEdgeViewPosition; - - void main(){ - vec4 usf_DiffuseColor = vec4(1.0); - float colorWobbleMix = smoothstep(-1.,1.,vWobble); - vec2 colorPosMix = vec2(smoothstep(-1.,1.,vPosition.x),smoothstep(-1.,1.,vPosition.y)); - - usf_DiffuseColor.rgb = mix(mix(uColor0, uColor1, colorPosMix.x), mix(uColor2, uColor3, colorPosMix.y), colorWobbleMix); - ` - ), c.type === "MeshPhysicalMaterial" && i && (f.fragmentShader = f.fragmentShader.replace( - "#include ", - `${An}` - ), f.fragmentShader = f.fragmentShader.replace( - "#include ", - `${In}` - )), V(n)(f, y); - }, c.needsUpdate = !0; - const d = new a.MeshDepthMaterial({ - depthPacking: a.RGBADepthPacking - }); - return d.onBeforeCompile = (f, y) => { - Object.assign(f.uniforms, c.userData.uniforms), f.vertexShader = Ae(f.vertexShader), V(r)(f, y); - }, d.needsUpdate = !0, { material: c, depthMaterial: d }; - }, [ - t, - e, - n, - r, - v, - i - ]); - return { - material: s, - depthMaterial: u - }; -}, Vn = ({ - scene: e = !1, - geometry: t, - isCustomTransmission: n, - baseMaterial: r, - materialParameters: i, - onBeforeCompile: v, - depthOnBeforeCompile: s, - uniforms: u -}) => { - const c = b(() => { - let p = t || new a.IcosahedronGeometry(2, 20); - return p = Rn(p), p.computeTangents(), p; - }, [t]), { material: d, depthMaterial: f } = Fn({ - baseMaterial: r, - materialParameters: i, - onBeforeCompile: v, - depthOnBeforeCompile: s, - uniforms: u, - isCustomTransmission: n - }), y = $(e, c, d, a.Mesh), x = d.userData, o = A(x), g = z(x); - return [ - D( - (p, m, C) => { - p && o( - "uTime", - (m == null ? void 0 : m.beat) || p.clock.getElapsedTime() - ), m !== void 0 && (o("uWobbleStrength", m.wobbleStrength), o( - "uWobblePositionFrequency", - m.wobblePositionFrequency - ), o("uWobbleTimeFrequency", m.wobbleTimeFrequency), o("uWarpStrength", m.warpStrength), o("uWarpPositionFrequency", m.warpPositionFrequency), o("uWarpTimeFrequency", m.warpTimeFrequency), o("uColor0", m.color0), o("uColor1", m.color1), o("uColor2", m.color2), o("uColor3", m.color3), o("uColorMix", m.colorMix), o("uEdgeThreshold", m.edgeThreshold), o("uEdgeColor", m.edgeColor), o("uChromaticAberration", m.chromaticAberration), o("uAnisotropicBlur", m.anisotropicBlur), o("uDistortion", m.distortion), o("uDistortionScale", m.distortionScale), o("uRefractionSamples", m.refractionSamples), o("uTemporalDistortion", m.temporalDistortion), g(C)); - }, - [o, g] - ), - { - mesh: y, - depthMaterial: f - } - ]; -}, N = Object.freeze({ - wobbleStrength: 0.3, - wobblePositionFrequency: 0.3, - wobbleTimeFrequency: 0.3, - warpStrength: 0.3, - warpPositionFrequency: 0.3, - warpTimeFrequency: 0.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: 0.1, - anisotropicBlur: 0.1, - distortion: 0, - distortionScale: 0.1, - temporalDistortion: 0, - refractionSamples: 6, - beat: !1 -}), mr = ({ - size: e, - dpr: t, - samples: n, - isSizeUpdate: r, - camera: i, - geometry: v, - baseMaterial: s, - materialParameters: u, - uniforms: c, - onBeforeCompile: d, - depthOnBeforeCompile: f, - isCustomTransmission: y -}) => { - const x = U(t), o = b(() => new a.Scene(), []), [g, { mesh: l, depthMaterial: p }] = Vn({ - baseMaterial: s, - materialParameters: u, - scene: o, - geometry: v, - uniforms: c, - onBeforeCompile: d, - depthOnBeforeCompile: f, - isCustomTransmission: y - }), [m, C] = W({ - scene: o, - camera: i, - size: e, - dpr: x.fbo, - samples: n, - isSizeUpdate: r, - depthBuffer: !0 - }), M = D( - (S, _, w) => (g(S, _, w), C(S.gl)), - [C, g] - ), h = D( - (S, _) => { - g(null, S, _); - }, - [g] - ); - return [ - M, - h, - { - scene: o, - mesh: l, - depthMaterial: p, - renderTarget: m, - output: m.texture - } - ]; -}, fr = (e, t, n) => { - const r = b(() => { - const i = new a.Mesh(t, n); - return e.add(i), i; - }, [t, n, e]); - return ae(() => () => { - e.remove(r), t.dispose(), n.dispose(); - }, [e, t, n, r]), 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 < 0.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 < 0.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 < 0.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 < 0.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 < 0.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 < 0.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 n = 2.5949095; - return e < 0.5 ? Math.pow(2 * e, 2) * ((n + 1) * 2 * e - n) / 2 : (Math.pow(2 * e - 2, 2) * ((n + 1) * (e * 2 - 2) + n) + 2) / 2; - }, - easeInElastic(e) { - const t = 2 * Math.PI / 3; - return e === 0 ? 0 : e === 1 ? 1 : -Math.pow(2, 10 * e - 10) * Math.sin((e * 10 - 10.75) * t); - }, - easeOutElastic(e) { - const t = 2 * Math.PI / 3; - return e === 0 ? 0 : e === 1 ? 1 : Math.pow(2, -10 * e) * Math.sin((e * 10 - 0.75) * t) + 1; - }, - easeInOutElastic(e) { - const t = 2 * Math.PI / 4.5; - return e === 0 ? 0 : e === 1 ? 1 : e < 0.5 ? -(Math.pow(2, 20 * e - 10) * Math.sin((20 * e - 11.125) * t)) / 2 : Math.pow(2, -20 * e + 10) * Math.sin((20 * e - 11.125) * t) / 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 + 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 - ge.easeOutBounce(1 - 2 * e)) / 2 : (1 + ge.easeOutBounce(2 * e - 1)) / 2; - } -}); -function zn(e) { - let t = Math.sin(e * 12.9898) * 43758.5453; - return t - Math.floor(t); -} -const dr = (e, t = "easeOutQuart") => { - const n = e / 60, r = ge[t]; - return D( - (v) => { - let s = v.getElapsedTime() * n; - const u = Math.floor(s), c = r(s - u); - s = c + u; - const d = zn(u); - return { - beat: s, - floor: u, - fract: c, - hash: d - }; - }, - [n, r] - ); -}, gr = (e = 60) => { - const t = b(() => 1 / Math.max(Math.min(e, 60), 1), [e]), n = L(null); - return D( - (i) => { - const v = i.getElapsedTime(); - return n.current === null || v - n.current >= t ? (n.current = v, !0) : !1; - }, - [t] - ); -}, Bn = (e) => { - var r, i; - const t = (r = e.dom) == null ? void 0 : r.length, n = (i = e.texture) == null ? void 0 : i.length; - return !t || !n || t !== n; -}; -var On = `varying vec2 vUv; - -void main() { - vUv = uv; - gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0); -}`, Un = `precision highp float; - -varying vec2 vUv; -uniform sampler2D u_texture; -uniform vec2 u_textureResolution; -uniform vec2 u_resolution; -uniform float u_borderRadius; - -void main() { - - float screenAspect = u_resolution.x / u_resolution.y; - float textureAspect = u_textureResolution.x / u_textureResolution.y; - vec2 ratio = vec2( - min(screenAspect / textureAspect, 1.0), - min(textureAspect / screenAspect, 1.0) - ); - - vec2 adjustedUv = vUv * ratio + (1.0 - ratio) * 0.5; - vec3 textureColor = texture2D(u_texture, adjustedUv).rgb; - float textureAlpha = texture2D(u_texture, adjustedUv).a; - - - float maxSide = max(u_resolution.x, u_resolution.y); - float minSide = min(u_resolution.x, u_resolution.y); - vec2 aspect = u_resolution / maxSide; - vec2 alphaUv = vUv - 0.5; - - float borderRadius = min(u_borderRadius, minSide * 0.5); - vec2 offset = vec2(borderRadius) / u_resolution; - vec2 alphaXY = smoothstep(vec2(0.5 - offset), vec2(0.5 - offset - 0.001), abs(alphaUv)); - float alpha = min(1.0, alphaXY.x + alphaXY.y); - - vec2 alphaUv2 = abs(vUv - 0.5); - float radius = borderRadius / maxSide; - alphaUv2 = (alphaUv2 - 0.5) * aspect + radius; - float roundAlpha = smoothstep(radius + 0.001, radius, length(alphaUv2)); - - alpha = min(1.0, alpha + roundAlpha); - - - alpha *= textureAlpha; - - gl_FragColor = vec4(textureColor, alpha); -}`; -const En = ({ - params: e, - scene: t, - uniforms: n, - onBeforeCompile: r -}) => { - t.children.length > 0 && (t.children.forEach((i) => { - i instanceof a.Mesh && (i.geometry.dispose(), i.material.dispose()); - }), t.remove(...t.children)), e.texture.forEach((i, v) => { - const s = new a.ShaderMaterial({ - uniforms: { - u_texture: { value: i }, - u_textureResolution: { - value: new a.Vector2(0, 0) - }, - u_resolution: { value: new a.Vector2(0, 0) }, - u_borderRadius: { - value: e.boderRadius[v] ? e.boderRadius[v] : 0 - }, - ...n - }, - vertexShader: On, - fragmentShader: Un, - ...B, - // Must be transparent. - transparent: !0 - }); - s.onBeforeCompile = V(r); - const u = new a.Mesh(new a.PlaneGeometry(1, 1), s); - t.add(u); - }); -}, Ln = () => { - const e = L([]), t = L([]); - return D( - ({ - isIntersectingRef: r, - isIntersectingOnceRef: i, - params: v - }) => { - e.current.length > 0 && e.current.forEach((u, c) => { - u.unobserve(t.current[c]); - }), t.current = [], e.current = []; - const s = new Array(v.dom.length).fill(!1); - r.current = [...s], i.current = [...s], v.dom.forEach((u, c) => { - const d = (y) => { - y.forEach((x) => { - v.onIntersect[c] && v.onIntersect[c](x), r.current[c] = x.isIntersecting; - }); - }, f = new IntersectionObserver(d, { - rootMargin: "0px", - threshold: 0 - }); - f.observe(u), e.current.push(f), t.current.push(u); - }); - }, - [] - ); -}, $n = () => { - const e = L([]), t = D( - ({ - params: n, - customParams: r, - size: i, - resolutionRef: v, - scene: s, - isIntersectingRef: u - }) => { - s.children.length !== e.current.length && (e.current = new Array(s.children.length)), s.children.forEach((c, d) => { - var x, o, g, l, p, m; - const f = n.dom[d]; - if (!f) - return; - const y = f.getBoundingClientRect(); - if (e.current[d] = y, c.scale.set(y.width, y.height, 1), c.position.set( - y.left + y.width * 0.5 - i.width * 0.5, - -y.top - y.height * 0.5 + i.height * 0.5, - 0 - ), u.current[d] && (n.rotation[d] && c.rotation.copy(n.rotation[d]), c instanceof a.Mesh)) { - const C = c.material, M = A(C), h = z(C); - M("u_texture", n.texture[d]), M("u_textureResolution", [ - ((g = (o = (x = n.texture[d]) == null ? void 0 : x.source) == null ? void 0 : o.data) == null ? void 0 : g.width) || 0, - ((m = (p = (l = n.texture[d]) == null ? void 0 : l.source) == null ? void 0 : p.data) == null ? void 0 : m.height) || 0 - ]), M( - "u_resolution", - v.current.set(y.width, y.height) - ), M( - "u_borderRadius", - n.boderRadius[d] ? n.boderRadius[d] : 0 - ), h(r); - } - }); - }, - [] - ); - return [e.current, t]; -}, jn = () => { - const e = L([]), t = L([]), n = D((r, i = !1) => { - e.current.forEach((s, u) => { - s && (t.current[u] = !0); - }); - const v = i ? [...t.current] : [...e.current]; - return r < 0 ? v : v[r]; - }, []); - return { - isIntersectingRef: e, - isIntersectingOnceRef: t, - isIntersecting: n - }; -}, qn = (e) => ({ onView: n, onHidden: r }) => { - const i = L(!1); - ae(() => { - let v; - const s = () => { - e.current.some((u) => u) ? i.current || (n && n(), i.current = !0) : i.current && (r && r(), i.current = !1), v = requestAnimationFrame(s); - }; - return v = requestAnimationFrame(s), () => { - cancelAnimationFrame(v); - }; - }, [n, r]); -}, Wn = { - texture: [], - dom: [], - boderRadius: [], - rotation: [], - onIntersect: [] -}, hr = ({ size: e, dpr: t, samples: n, isSizeUpdate: r, uniforms: i, onBeforeCompile: v }, s = []) => { - const u = U(t), c = b(() => new a.Scene(), []), d = j(e), [f, y] = W({ - scene: c, - camera: d, - size: e, - dpr: u.fbo, - samples: n, - isSizeUpdate: r - }), [x, o] = q({ - ...Wn, - updateKey: performance.now() - }), [g, l] = $n(), p = L(new a.Vector2(0, 0)), [m, C] = Ee(!0); - b( - () => C(!0), - // eslint-disable-next-line react-hooks/exhaustive-deps - s - ); - const M = L(null), h = b(() => T, []), S = Ln(), { isIntersectingOnceRef: _, isIntersectingRef: w, isIntersecting: I } = jn(), R = qn(w), F = b(() => (O, k) => { - o(O), l({ - params: x, - customParams: k, - size: e, - resolutionRef: p, - scene: c, - isIntersectingRef: w - }); - }, [w, o, l, e, c, x]); - return [ - D( - (O, k, te) => { - const { gl: H, size: K } = O; - if (F(k, te), Bn(x)) - return h; - if (m) { - if (M.current === x.updateKey) - return h; - M.current = x.updateKey; - } - return m && (En({ - params: x, - size: K, - scene: c, - uniforms: i, - onBeforeCompile: v - }), S({ - isIntersectingRef: w, - isIntersectingOnceRef: _, - params: x - }), C(!1)), y(H); - }, - [ - y, - i, - S, - v, - m, - c, - x, - _, - w, - h, - F - ] - ), - F, - { - scene: c, - camera: d, - renderTarget: f, - output: f.texture, - isIntersecting: I, - DOMRects: g, - intersections: w.current, - useDomView: R - } - ]; -}, xr = ({ - scene: e, - camera: t, - size: n, - dpr: r = !1, - isSizeUpdate: i = !1, - samples: v = 0, - depthBuffer: s = !1, - depthTexture: u = !1 -}, c) => { - const d = L([]), f = Y(n, r); - d.current = b(() => Array.from({ length: c }, () => { - const x = new a.WebGLRenderTarget( - f.x, - f.y, - { - ...he, - samples: v, - depthBuffer: s - } - ); - return u && (x.depthTexture = new a.DepthTexture( - f.x, - f.y, - a.FloatType - )), x; - }), [c]), i && d.current.forEach( - (x) => x.setSize(f.x, f.y) - ), ae(() => { - const x = d.current; - return () => { - x.forEach((o) => o.dispose()); - }; - }, [c]); - const y = D( - (x, o, g) => { - const l = d.current[o]; - return Ce({ - gl: x, - scene: e, - camera: t, - fbo: l, - onBeforeRender: () => g && g({ read: l.texture }) - }), l.texture; - }, - [e, t] - ); - return [d.current, y]; -}; -export { - Zt as ALPHABLENDING_PARAMS, - Sn as BLANK_PARAMS, - ve as BLENDING_PARAMS, - fe as BRIGHTNESSPICKER_PARAMS, - ne as BRUSH_PARAMS, - J as CHROMAKEY_PARAMS, - Z as COLORSTRATA_PARAMS, - ce as COSPALETTE_PARAMS, - an as COVERTEXTURE_PARAMS, - Fe as DELTA_TIME, - Wn as DOMSYNCER_PARAMS, - Me as DUOTONE_PARAMS, - ge as Easing, - he as FBO_OPTION, - ht as FLUID_PARAMS, - Ve as FXBLENDING_PARAMS, - oe as FXTEXTURE_PARAMS, - Se as HSV_PARAMS, - ue as MARBLE_PARAMS, - E as MORPHPARTICLES_PARAMS, - de as MOTIONBLUR_PARAMS, - re as NOISE_PARAMS, - Mt as RIPPLE_PARAMS, - ze as SIMPLEBLUR_PARAMS, - pe as WAVE_PARAMS, - N as WOBBLE3D_PARAMS, - Ce as renderFBO, - z as setCustomUniform, - A as setUniform, - fr as useAddMesh, - or as useAlphaBlending, - dr as useBeat, - vr as useBlank, - er as useBlending, - nr as useBrightnessPicker, - Gn as useBrush, - j as useCamera, - cr as useChromaKey, - Yn as useColorStrata, - xr as useCopyTexture, - Zn as useCosPalette, - ir as useCoverTexture, - Pn as useCreateMorphParticles, - Vn as useCreateWobble3D, - hr as useDomSyncer, - se as useDoubleFBO, - Jn as useDuoTone, - gr as useFPSLimiter, - Kn as useFluid, - rr as useFxBlending, - tr as useFxTexture, - ar as useHSV, - Qn as useMarble, - pr as useMorphParticles, - sr as useMotionBlur, - Hn as useNoise, - q as useParams, - _e as usePointer, - Y as useResolution, - Xn as useRipple, - ur as useSimpleBlur, - W as useSingleFBO, - lr as useWave, - mr 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 deleted file mode 100644 index 6d61e7fb..00000000 --- a/packages/use-shader-fx/build/use-shader-fx.js.map +++ /dev/null @@ -1 +0,0 @@ -{"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/planeVert.glsl","../src/libs/shaders/resolveShaders.ts","../src/utils/setOnBeforeCompile.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","../node_modules/three-stdlib/utils/BufferGeometryUtils.js","../src/fxs/3D/useWobble3D/shaders/transmission_pars_fragment.glsl","../src/fxs/3D/useWobble3D/shaders/transmission_fragment.glsl","../src/fxs/3D/useWobble3D/useMaterial.ts","../src/fxs/3D/useWobble3D/useCreateWobble3D.ts","../src/fxs/3D/useWobble3D/index.ts","../src/utils/useAddMesh.ts","../src/libs/easing.ts","../src/misc/useBeat.ts","../src/misc/useFPSLimiter.ts","../src/misc/useDomSyncer/utils/errorHandler.ts","../src/misc/useDomSyncer/shader/main.vert","../src/misc/useDomSyncer/shader/main.frag","../src/misc/useDomSyncer/utils/createMesh.ts","../src/misc/useDomSyncer/utils/useIntersectionHandler.ts","../src/misc/useDomSyncer/utils/useUpdateDomRect.ts","../src/misc/useDomSyncer/utils/useIsIntersecting.ts","../src/misc/useDomSyncer/utils/createUseDomView.ts","../src/misc/useDomSyncer/index.ts","../src/misc/useCopyTexture.ts"],"sourcesContent":["#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 const resolution = useMemo(\n () => new THREE.Vector2(_width, _height),\n [_width, _height]\n );\n return resolution;\n};\n","type UniformValue =\n | THREE.CubeTexture\n | THREE.Texture\n | Int32Array\n | Float32Array\n | THREE.Matrix4\n | THREE.Matrix3\n | THREE.Quaternion\n | THREE.Vector4\n | THREE.Vector3\n | THREE.Vector2\n | THREE.Color\n | number\n | boolean\n | Array\n | null\n | undefined;\ntype UniformObject = { [key: string]: { value: UniformValue } };\n\nexport const setUniform =\n (material: { uniforms: T }) =>\n (key: keyof T, value: UniformValue) => {\n if (value === undefined) {\n return;\n }\n 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}","import * as THREE from \"three\";\n\nimport wobble3D from \"./shaderChunk/wobble3D.glsl\";\nimport snoise from \"./shaderChunk/snoise.glsl\";\nimport coverTexture from \"./shaderChunk/coverTexture.glsl\";\nimport fxBlending from \"./shaderChunk/fxBlending.glsl\";\nimport planeVert from \"./shaderChunk/planeVert.glsl\";\n\nconst SHADER_CHUNK: { [key: string]: string } = {\n wobble3D,\n snoise,\n coverTexture,\n fxBlending,\n planeVert,\n};\n\nconst includePattern = /^[ \\t]*#usf +<([\\w\\d./]+)>/gm;\n\nfunction includeReplacer(match: string, include: string) {\n let string = SHADER_CHUNK[include] || \"\";\n return resolveIncludes(string);\n}\n\nfunction resolveIncludes(string: string) {\n return string.replace(includePattern, includeReplacer);\n}\n\nexport const resolveShaders = (shader: THREE.Shader) => {\n shader.vertexShader = resolveIncludes(shader.vertexShader);\n shader.fragmentShader = resolveIncludes(shader.fragmentShader);\n};\n","import { resolveShaders } from \"../libs/shaders/resolveShaders\";\n\ntype OnBeforeCompile = (\n shader: THREE.Shader,\n renderer: THREE.WebGLRenderer\n) => void;\n\nexport const setOnBeforeCompile = (\n onBeforeCompile?: OnBeforeCompile\n): OnBeforeCompile => {\n return (shader, renderer) => {\n onBeforeCompile && onBeforeCompile(shader, renderer);\n resolveShaders(shader);\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 { 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uBuffer: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent\n transparent: true,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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_OPTION: THREE.RenderTargetOptions = {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n type: THREE.HalfFloatType,\n stencilBuffer: false,\n};\n\nexport type UseFboProps = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n size: Size;\n /** If dpr is set, dpr will be multiplied, default : `false` */\n dpr?: number | false;\n /** Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false` */\n isSizeUpdate?: boolean;\n /** Defines the count of MSAA samples. Can only be used with WebGL 2. default : `0.0` */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, default : `false` */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. default : `false` */\n depthTexture?: boolean;\n};\n\nexport const renderFBO = ({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender,\n onSwap,\n}: {\n gl: THREE.WebGLRenderer;\n fbo: THREE.WebGLRenderTarget;\n scene: THREE.Scene;\n camera: THREE.Camera;\n onBeforeRender: () => void;\n onSwap?: () => void;\n}) => {\n gl.setRenderTarget(fbo);\n onBeforeRender();\n gl.clear();\n gl.render(scene, camera);\n onSwap && onSwap();\n gl.setRenderTarget(null);\n gl.clear();\n};\n\ntype UpdateRenderTarget = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseSingleFBOReturn = [THREE.WebGLRenderTarget, UpdateRenderTarget];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [THREE.WebGLRenderTarget , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useSingleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseSingleFBOReturn => {\n const renderTarget = useRef();\n\n const resolution = useResolution(size, dpr);\n\n renderTarget.current = useMemo(\n () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { FBO_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget | null;\n write: THREE.WebGLRenderTarget | null;\n};\n\ninterface WebGLDoubleRenderTarget extends DoubleRenderTarget {\n swap: () => void;\n}\n\ntype FBOUpdateFunction = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({\n read,\n write,\n }: {\n read: THREE.Texture;\n write: THREE.Texture;\n }) => void\n) => THREE.Texture;\n\ntype UseDoubleFBOReturn = [\n { read: THREE.WebGLRenderTarget; write: THREE.WebGLRenderTarget },\n FBOUpdateFunction\n];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default : `false`\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false`\n * @returns [{read:THREE.WebGLRenderTarget,write:THREE.WebGLRenderTarget} , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useDoubleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseDoubleFBOReturn => {\n const renderTarget = useRef({\n read: null,\n write: null,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n });\n\n const resolution = useResolution(size, dpr);\n\n const initRenderTargets = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n\n if (depthTexture) {\n read.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n write.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n\n return { read, write };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n renderTarget.current.read = initRenderTargets.read;\n renderTarget.current.write = initRenderTargets.write;\n\n if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, []);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current;\n renderFBO({\n gl,\n scene,\n camera,\n fbo: fbo.write!,\n onBeforeRender: () =>\n onBeforeRender &&\n onBeforeRender({\n read: fbo.read!.texture,\n write: fbo.write!.texture,\n }),\n onSwap: () => fbo.swap(),\n });\n return fbo.read?.texture as THREE.Texture;\n },\n [scene, camera]\n );\n\n return [\n { read: renderTarget.current.read, write: renderTarget.current.write },\n updateRenderTarget,\n ];\n};\n","import { Dpr } from \"../fxs/types\";\n\nexport const getDpr = (\n dpr: Dpr\n): { shader: number | false; fbo: number | false } => {\n if (typeof dpr === \"number\") {\n return { shader: dpr, fbo: dpr };\n }\n return {\n shader: dpr.shader ?? false,\n fbo: dpr.fbo ?? false,\n };\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { PointerValues, usePointer } from \"../../../misc/usePointer\";\nimport {\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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const pressureEnd = useRef(null);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class AdvectionMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uSource: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n dt: { value: number };\n dissipation: { value: number };\n };\n}\n\nexport const useAdvectionMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class DivergenceMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useDivergenceMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const divergenceMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class PressureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uDivergence: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const usePressureMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const pressureMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: null },\n uDivergence: { value: null },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class CurlMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useCurlMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const curlMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class VorticityMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uCurl: { value: THREE.Texture };\n curl: { value: number };\n dt: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useVorticityMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const vorticityMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n uCurl: { value: null },\n curl: { value: 0 },\n dt: { value: DELTA_TIME },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class ClearMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n value: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useClearMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n value: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class GradientSubtractMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useGradientSubtractMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const gradientSubtractMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: DEFAULT_TEXTURE },\n uVelocity: { value: DEFAULT_TEXTURE },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\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 = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const splatMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 density_dissipation?: number;\n /** velocity dissipation , default : `0.99` */\n velocity_dissipation?: number;\n /** velocity acceleration , default : `10.0` */\n velocity_acceleration?: number;\n /** pressure dissipation , default : `0.9` */\n pressure_dissipation?: number;\n /** pressure iterations. affects performance , default : `20` */\n pressure_iterations?: number;\n /** curl_strength , default : `35` */\n curl_strength?: number;\n /** splat radius , default : `0.002` */\n splat_radius?: number;\n /** Fluid Color.THREE.Vector3 Alternatively, it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default : `THREE.Vector3(1.0, 1.0, 1.0)` */\n fluid_color?:\n | ((velocity: THREE.Vector2) => THREE.Vector3)\n | THREE.Vector3\n | THREE.Color;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type FluidObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n materials: FluidMaterials;\n camera: THREE.Camera;\n renderTarget: {\n velocity: DoubleRenderTarget;\n density: DoubleRenderTarget;\n curl: THREE.WebGLRenderTarget;\n divergence: THREE.WebGLRenderTarget;\n pressure: DoubleRenderTarget;\n };\n output: THREE.Texture;\n};\n\nexport const FLUID_PARAMS: FluidParams = Object.freeze({\n density_dissipation: 0.98,\n velocity_dissipation: 0.99,\n velocity_acceleration: 10.0,\n pressure_dissipation: 0.9,\n pressure_iterations: 20,\n curl_strength: 35,\n splat_radius: 0.002,\n fluid_color: new THREE.Vector3(1.0, 1.0, 1.0),\n pointerValues: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFluid = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n customFluidProps,\n}: {\n /** you can add `onBeforeComile` of the next material.`initial`,`curl`,`vorticity`,`advection`,`divergence`,`pressure`,`clear`,`gradientSubtract`,`splat` \n\t * ```ts\n\t * fluidOnBeforeCompile: {\n vorticity: {\n onBeforeCompile: (shader) => console.log(shader),\n\t\t\t\tuniforms:{\n\t\t\t\t\thoge: { value: 0.0 },\n\t\t\t\t}\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 }),\n [scene, camera, size, samples, _dpr.fbo, isSizeUpdate]\n );\n const [velocityFBO, updateVelocityFBO] = useDoubleFBO(fboProps);\n const [densityFBO, updateDensityFBO] = useDoubleFBO(fboProps);\n const [curlFBO, updateCurlFBO] = useSingleFBO(fboProps);\n const [divergenceFBO, updateDivergenceFBO] = useSingleFBO(fboProps);\n const [pressureFBO, updatePressureFBO] = useDoubleFBO(fboProps);\n\n const 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.velocity_dissipation!\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.density_dissipation!\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.velocity_acceleration!)\n );\n updateParamsList.splat(\n \"color\",\n spaltVec.current.set(scaledDiff.x, scaledDiff.y, 1.0)\n );\n updateParamsList.splat(\"radius\", params.splat_radius!);\n });\n updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n updateParamsList.splat(\"uTarget\", read);\n const color: THREE.Vector3 | THREE.Color =\n typeof params.fluid_color === \"function\"\n ? params.fluid_color(pointerValues.velocity)\n : params.fluid_color!;\n 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.curl_strength!);\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.pressure_dissipation!);\n });\n\n setMeshMaterial(materials.pressureMaterial);\n updateParamsList.pressure(\"uDivergence\", divergenceTex);\n let pressureTexTemp: THREE.Texture;\n for (let i = 0; i < params.pressure_iterations!; 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","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}","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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\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 uniforms: {\n uOpacity: { value: 0.0 },\n uMap: { value: texture || DEFAULT_TEXTURE },\n ...uniforms,\n },\n blending: THREE.AdditiveBlending,\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent.\n transparent: true,\n });\n return mat;\n }, [texture, uniforms]);\n\n const meshArr = useMemo(() => {\n const temp = [];\n for (let i = 0; i < max; i++) {\n const clonedMat = material.clone();\n\n clonedMat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\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 }, [onBeforeCompile, 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 fadeout_speed?: number;\n /** scale rate, default : `0.3` */\n scale?: number;\n /** alpha, default : `0.6` */\n alpha?: number;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type RippleObject = {\n scene: THREE.Scene;\n meshArr: THREE.Mesh[];\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const RIPPLE_PARAMS: RippleParams = Object.freeze({\n frequency: 0.01,\n rotation: 0.05,\n fadeout_speed: 0.9,\n scale: 0.3,\n alpha: 0.6,\n pointerValues: false,\n});\n\ninterface UseRippleProps extends HooksProps {\n /** texture applied to ripple */\n texture?: THREE.Texture;\n /** ripple size, default:64 */\n scale?: number;\n /** ripple max length, default:100 */\n max?: number;\n}\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useRipple = ({\n texture,\n scale = 64,\n max = 100,\n size,\n dpr,\n samples,\n isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: UseRippleProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const 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.fadeout_speed! * mesh.scale.x + params.scale!;\n mesh.scale.y = mesh.scale.x;\n const opacity = material.uniforms.uOpacity.value;\n setUniform(material)(\n \"uOpacity\",\n opacity * params.fadeout_speed!\n );\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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTime: { value: 0.0 },\n scale: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: 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: { value: COLORSTRATA_PARAMS.laminateInterval },\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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateValue = setUniform(material);\n 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 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(MARBLE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(COSPALETTE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uColor0: { value: DUOTONE_PARAMS.color0 },\n uColor1: { value: DUOTONE_PARAMS.color1 },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { FXTEXTURE_PARAMS } from \".\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture0: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_brightness: { value: BRIGHTNESSPICKER_PARAMS.brightness },\n u_min: { value: BRIGHTNESSPICKER_PARAMS.min },\n u_max: { value: BRIGHTNESSPICKER_PARAMS.max },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n uMapIntensity: { value: FXBLENDING_PARAMS.mapIntensity },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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 uniforms,\n onBeforeCompile,\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 });\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\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\nvoid main() {\n\tvec4 tex = texture2D(u_texture, vUv);\n\tvec3 hsv = rgb2hsv(tex.rgb);\n\thsv.y *= u_saturation;\n\thsv.z *= u_brightness;\n\tvec3 final = hsv2rgb(hsv);\n\tgl_FragColor = vec4(final, tex.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { HSV_PARAMS } from \".\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_brightness: { value: HSV_PARAMS.brightness },\n u_saturation: { value: HSV_PARAMS.saturation },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n uniforms,\n onBeforeCompile,\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 });\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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture: { value: DEFAULT_TEXTURE },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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 uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] =\n useParams(COVERTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uBlurSize: { value: SIMPLEBLUR_PARAMS.blurSize },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n const 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 const iterations = params.blurPower!;\n for (let i = 0; i < iterations; i++) {\n updateValue(\"uTexture\", _tempTexture);\n _tempTexture = updateTempTexture(gl);\n }\n\n return _tempTexture;\n },\n [updateTempTexture, updateValue, 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(MOTIONBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uEpicenter: { value: WAVE_PARAMS.epicenter },\n uProgress: { value: WAVE_PARAMS.progress },\n uStrength: { value: WAVE_PARAMS.strength },\n uWidth: { value: WAVE_PARAMS.width },\n uMode: { value: 0 },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(CHROMAKEY_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene; size: Size; dpr: number | false } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uBackbuffer: { value: DEFAULT_TEXTURE },\n uTime: { value: 0 },\n uPointer: { value: new THREE.Vector2() },\n uResolution: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) as BlankMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { BlankMaterial, 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(BLANK_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n size: Size;\n dpr: number | false;\n geometry: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\n mapArray?: THREE.Texture[];\n} & MaterialProps) => {\n const modifiedPositions = useMemo(\n () => modifyAttributes(positions, geometry, \"position\", 3),\n [positions, geometry]\n );\n\n const modifiedUvs = useMemo(\n () => modifyAttributes(uvs, geometry, \"uv\", 2),\n [uvs, geometry]\n );\n\n const material = useMemo(() => {\n if (modifiedPositions.length !== modifiedUvs.length) {\n ISDEV &&\n console.log(\"use-shader-fx:positions and uvs are not matched\");\n }\n\n // vertex\n const rewritedVertexShader = rewriteVertexShader(\n modifiedUvs,\n geometry,\n \"uv\",\n rewriteVertexShader(\n modifiedPositions,\n geometry,\n \"position\",\n vertexShader,\n 3\n ),\n 2\n );\n\n // fragment\n const { rewritedFragmentShader, mapArrayUniforms } =\n rewriteFragmentShader(mapArray, fragmentShader);\n\n const mat = new THREE.ShaderMaterial({\n vertexShader: rewritedVertexShader,\n fragmentShader: rewritedFragmentShader,\n blending: THREE.AdditiveBlending,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent\n transparent: true,\n uniforms: {\n uResolution: { value: new THREE.Vector2(0, 0) },\n uMorphProgress: { value: MORPHPARTICLES_PARAMS.morphProgress },\n uBlurAlpha: { value: MORPHPARTICLES_PARAMS.blurAlpha },\n uBlurRadius: { value: MORPHPARTICLES_PARAMS.blurRadius },\n uPointSize: { value: MORPHPARTICLES_PARAMS.pointSize },\n uPointAlpha: { value: MORPHPARTICLES_PARAMS.pointAlpha },\n uPicture: { value: 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: { value: MORPHPARTICLES_PARAMS.wobbleStrength },\n uWarpPositionFrequency: {\n value: MORPHPARTICLES_PARAMS.warpPositionFrequency,\n },\n uWarpTimeFrequency: {\n value: MORPHPARTICLES_PARAMS.warpTimeFrequency,\n },\n uWarpStrength: { value: MORPHPARTICLES_PARAMS.warpStrength },\n uDisplacement: { value: 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: { value: MORPHPARTICLES_PARAMS.sizeRandomMin },\n uSizeRandomMax: { value: MORPHPARTICLES_PARAMS.sizeRandomMax },\n uDivergence: { value: MORPHPARTICLES_PARAMS.divergence },\n uDivergencePoint: { value: MORPHPARTICLES_PARAMS.divergencePoint },\n ...mapArrayUniforms,\n ...uniforms,\n },\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [\n geometry,\n modifiedPositions,\n modifiedUvs,\n mapArray,\n onBeforeCompile,\n uniforms,\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 uniforms,\n onBeforeCompile,\n}: Create3DHooksProps &\n UseCreateMorphParticlesProps): UseCreateMorphParticlesReturn => {\n const _dpr = getDpr(dpr);\n\n const morphGeometry = useMemo(() => {\n const geo = geometry || new THREE.SphereGeometry(1, 32, 32);\n geo.setIndex(null);\n // Since it is a particle, normal is not necessary\n geo.deleteAttribute(\"normal\");\n return geo;\n }, [geometry]);\n\n const { material, modifiedPositions, modifiedUvs } = useMaterial({\n size,\n dpr: _dpr.shader,\n geometry: morphGeometry,\n positions,\n uvs,\n mapArray,\n uniforms,\n onBeforeCompile,\n });\n\n const { points, interactiveMesh } = useCreateObject({\n scene,\n geometry: morphGeometry,\n material,\n });\n\n const updateValue = setUniform(material);\n const 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 camera,\n geometry,\n positions,\n uvs,\n uniforms,\n onBeforeCompile,\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 uniforms,\n onBeforeCompile,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n });\n\n const updateFx = useCallback(\n (\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 { BufferGeometry, BufferAttribute, InterleavedBuffer, InterleavedBufferAttribute, TrianglesDrawMode, TriangleFanDrawMode, TriangleStripDrawMode, Vector3, Float32BufferAttribute } from \"three\";\nimport { getWithKey } from \"../types/helpers.js\";\nconst mergeBufferGeometries = (geometries, useGroups) => {\n const isIndexed = geometries[0].index !== null;\n const attributesUsed = new Set(Object.keys(geometries[0].attributes));\n const morphAttributesUsed = new Set(Object.keys(geometries[0].morphAttributes));\n const attributes = {};\n const morphAttributes = {};\n const morphTargetsRelative = geometries[0].morphTargetsRelative;\n const mergedGeometry = new BufferGeometry();\n let offset = 0;\n geometries.forEach((geom, i) => {\n let attributesCount = 0;\n if (isIndexed !== (geom.index !== null)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.\"\n );\n return null;\n }\n for (let name in geom.attributes) {\n if (!attributesUsed.has(name)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.'\n );\n return null;\n }\n if (attributes[name] === void 0) {\n attributes[name] = [];\n }\n attributes[name].push(geom.attributes[name]);\n attributesCount++;\n }\n if (attributesCount !== attributesUsed.size) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". Make sure all geometries have the same number of attributes.\"\n );\n return null;\n }\n if (morphTargetsRelative !== geom.morphTargetsRelative) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". .morphTargetsRelative must be consistent throughout all geometries.\"\n );\n return null;\n }\n for (let name in geom.morphAttributes) {\n if (!morphAttributesUsed.has(name)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". .morphAttributes must be consistent throughout all geometries.\"\n );\n return null;\n }\n if (morphAttributes[name] === void 0)\n morphAttributes[name] = [];\n morphAttributes[name].push(geom.morphAttributes[name]);\n }\n mergedGeometry.userData.mergedUserData = mergedGeometry.userData.mergedUserData || [];\n mergedGeometry.userData.mergedUserData.push(geom.userData);\n if (useGroups) {\n let count;\n if (geom.index) {\n count = geom.index.count;\n } else if (geom.attributes.position !== void 0) {\n count = geom.attributes.position.count;\n } else {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". The geometry must have either an index or a position attribute\"\n );\n return null;\n }\n mergedGeometry.addGroup(offset, count, i);\n offset += count;\n }\n });\n if (isIndexed) {\n let indexOffset = 0;\n const mergedIndex = [];\n geometries.forEach((geom) => {\n const index = geom.index;\n for (let j = 0; j < index.count; ++j) {\n mergedIndex.push(index.getX(j) + indexOffset);\n }\n indexOffset += geom.attributes.position.count;\n });\n mergedGeometry.setIndex(mergedIndex);\n }\n for (let name in attributes) {\n const mergedAttribute = mergeBufferAttributes(attributes[name]);\n if (!mergedAttribute) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the \" + name + \" attribute.\"\n );\n return null;\n }\n mergedGeometry.setAttribute(name, mergedAttribute);\n }\n for (let name in morphAttributes) {\n const numMorphTargets = morphAttributes[name][0].length;\n if (numMorphTargets === 0)\n break;\n mergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n mergedGeometry.morphAttributes[name] = [];\n for (let i = 0; i < numMorphTargets; ++i) {\n const morphAttributesToMerge = [];\n for (let j = 0; j < morphAttributes[name].length; ++j) {\n morphAttributesToMerge.push(morphAttributes[name][j][i]);\n }\n const mergedMorphAttribute = mergeBufferAttributes(morphAttributesToMerge);\n if (!mergedMorphAttribute) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the \" + name + \" morphAttribute.\"\n );\n return null;\n }\n mergedGeometry.morphAttributes[name].push(mergedMorphAttribute);\n }\n }\n return mergedGeometry;\n};\nconst mergeBufferAttributes = (attributes) => {\n let TypedArray = void 0;\n let itemSize = void 0;\n let normalized = void 0;\n let arrayLength = 0;\n attributes.forEach((attr) => {\n if (TypedArray === void 0) {\n TypedArray = attr.array.constructor;\n }\n if (TypedArray !== attr.array.constructor) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.\"\n );\n return null;\n }\n if (itemSize === void 0)\n itemSize = attr.itemSize;\n if (itemSize !== attr.itemSize) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.\"\n );\n return null;\n }\n if (normalized === void 0)\n normalized = attr.normalized;\n if (normalized !== attr.normalized) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.\"\n );\n return null;\n }\n arrayLength += attr.array.length;\n });\n if (TypedArray && itemSize) {\n const array = new TypedArray(arrayLength);\n let offset = 0;\n attributes.forEach((attr) => {\n array.set(attr.array, offset);\n offset += attr.array.length;\n });\n return new BufferAttribute(array, itemSize, normalized);\n }\n};\nconst interleaveAttributes = (attributes) => {\n let TypedArray = void 0;\n let arrayLength = 0;\n let stride = 0;\n for (let i = 0, l = attributes.length; i < l; ++i) {\n const attribute = attributes[i];\n if (TypedArray === void 0)\n TypedArray = attribute.array.constructor;\n if (TypedArray !== attribute.array.constructor) {\n console.error(\"AttributeBuffers of different types cannot be interleaved\");\n return null;\n }\n arrayLength += attribute.array.length;\n stride += attribute.itemSize;\n }\n const interleavedBuffer = new InterleavedBuffer(new TypedArray(arrayLength), stride);\n let offset = 0;\n const res = [];\n const getters = [\"getX\", \"getY\", \"getZ\", \"getW\"];\n const setters = [\"setX\", \"setY\", \"setZ\", \"setW\"];\n for (let j = 0, l = attributes.length; j < l; j++) {\n const attribute = attributes[j];\n const itemSize = attribute.itemSize;\n const count = attribute.count;\n const iba = new InterleavedBufferAttribute(interleavedBuffer, itemSize, offset, attribute.normalized);\n res.push(iba);\n offset += itemSize;\n for (let c = 0; c < count; c++) {\n for (let k = 0; k < itemSize; k++) {\n const set = getWithKey(iba, setters[k]);\n const get = getWithKey(attribute, getters[k]);\n set(c, get(c));\n }\n }\n }\n return res;\n};\nfunction estimateBytesUsed(geometry) {\n let mem = 0;\n for (let name in geometry.attributes) {\n const attr = geometry.getAttribute(name);\n mem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n }\n const indices = geometry.getIndex();\n mem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n return mem;\n}\nfunction mergeVertices(geometry, tolerance = 1e-4) {\n tolerance = Math.max(tolerance, Number.EPSILON);\n const hashToIndex = {};\n const indices = geometry.getIndex();\n const positions = geometry.getAttribute(\"position\");\n const vertexCount = indices ? indices.count : positions.count;\n let nextIndex = 0;\n const attributeNames = Object.keys(geometry.attributes);\n const attrArrays = {};\n const morphAttrsArrays = {};\n const newIndices = [];\n const getters = [\"getX\", \"getY\", \"getZ\", \"getW\"];\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n const name = attributeNames[i];\n attrArrays[name] = [];\n const morphAttr = geometry.morphAttributes[name];\n if (morphAttr) {\n morphAttrsArrays[name] = new Array(morphAttr.length).fill(0).map(() => []);\n }\n }\n const decimalShift = Math.log10(1 / tolerance);\n const shiftMultiplier = Math.pow(10, decimalShift);\n for (let i = 0; i < vertexCount; i++) {\n const index = indices ? indices.getX(i) : i;\n let hash = \"\";\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const itemSize = attribute.itemSize;\n for (let k = 0; k < itemSize; k++) {\n hash += `${~~(attribute[getters[k]](index) * shiftMultiplier)},`;\n }\n }\n if (hash in hashToIndex) {\n newIndices.push(hashToIndex[hash]);\n } else {\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const morphAttr = geometry.morphAttributes[name];\n const itemSize = attribute.itemSize;\n const newarray = attrArrays[name];\n const newMorphArrays = morphAttrsArrays[name];\n for (let k = 0; k < itemSize; k++) {\n const getterFunc = getters[k];\n newarray.push(attribute[getterFunc](index));\n if (morphAttr) {\n for (let m = 0, ml = morphAttr.length; m < ml; m++) {\n newMorphArrays[m].push(morphAttr[m][getterFunc](index));\n }\n }\n }\n }\n hashToIndex[hash] = nextIndex;\n newIndices.push(nextIndex);\n nextIndex++;\n }\n }\n const result = geometry.clone();\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n const name = attributeNames[i];\n const oldAttribute = geometry.getAttribute(name);\n const buffer = new oldAttribute.array.constructor(attrArrays[name]);\n const attribute = new BufferAttribute(buffer, oldAttribute.itemSize, oldAttribute.normalized);\n result.setAttribute(name, attribute);\n if (name in morphAttrsArrays) {\n for (let j = 0; j < morphAttrsArrays[name].length; j++) {\n const oldMorphAttribute = geometry.morphAttributes[name][j];\n const buffer2 = new oldMorphAttribute.array.constructor(morphAttrsArrays[name][j]);\n const morphAttribute = new BufferAttribute(buffer2, oldMorphAttribute.itemSize, oldMorphAttribute.normalized);\n result.morphAttributes[name][j] = morphAttribute;\n }\n }\n }\n result.setIndex(newIndices);\n return result;\n}\nfunction toTrianglesDrawMode(geometry, drawMode) {\n if (drawMode === TrianglesDrawMode) {\n console.warn(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.\");\n return geometry;\n }\n if (drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode) {\n let index = geometry.getIndex();\n if (index === null) {\n const indices = [];\n const position = geometry.getAttribute(\"position\");\n if (position !== void 0) {\n for (let i = 0; i < position.count; i++) {\n indices.push(i);\n }\n geometry.setIndex(indices);\n index = geometry.getIndex();\n } else {\n console.error(\n \"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.\"\n );\n return geometry;\n }\n }\n const numberOfTriangles = index.count - 2;\n const newIndices = [];\n if (index) {\n if (drawMode === TriangleFanDrawMode) {\n for (let i = 1; i <= numberOfTriangles; i++) {\n newIndices.push(index.getX(0));\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n }\n } else {\n for (let i = 0; i < numberOfTriangles; i++) {\n if (i % 2 === 0) {\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i + 2));\n } else {\n newIndices.push(index.getX(i + 2));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i));\n }\n }\n }\n }\n if (newIndices.length / 3 !== numberOfTriangles) {\n console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.\");\n }\n const newGeometry = geometry.clone();\n newGeometry.setIndex(newIndices);\n newGeometry.clearGroups();\n return newGeometry;\n } else {\n console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:\", drawMode);\n return geometry;\n }\n}\nfunction computeMorphedAttributes(object) {\n if (object.geometry.isBufferGeometry !== true) {\n console.error(\"THREE.BufferGeometryUtils: Geometry is not of type BufferGeometry.\");\n return null;\n }\n const _vA = new Vector3();\n const _vB = new Vector3();\n const _vC = new Vector3();\n const _tempA = new Vector3();\n const _tempB = new Vector3();\n const _tempC = new Vector3();\n const _morphA = new Vector3();\n const _morphB = new Vector3();\n const _morphC = new Vector3();\n function _calculateMorphedAttributeData(object2, material2, attribute, morphAttribute, morphTargetsRelative2, a2, b2, c2, modifiedAttributeArray) {\n _vA.fromBufferAttribute(attribute, a2);\n _vB.fromBufferAttribute(attribute, b2);\n _vC.fromBufferAttribute(attribute, c2);\n const morphInfluences = object2.morphTargetInfluences;\n if (\n // @ts-ignore\n material2.morphTargets && morphAttribute && morphInfluences\n ) {\n _morphA.set(0, 0, 0);\n _morphB.set(0, 0, 0);\n _morphC.set(0, 0, 0);\n for (let i2 = 0, il2 = morphAttribute.length; i2 < il2; i2++) {\n const influence = morphInfluences[i2];\n const morph = morphAttribute[i2];\n if (influence === 0)\n continue;\n _tempA.fromBufferAttribute(morph, a2);\n _tempB.fromBufferAttribute(morph, b2);\n _tempC.fromBufferAttribute(morph, c2);\n if (morphTargetsRelative2) {\n _morphA.addScaledVector(_tempA, influence);\n _morphB.addScaledVector(_tempB, influence);\n _morphC.addScaledVector(_tempC, influence);\n } else {\n _morphA.addScaledVector(_tempA.sub(_vA), influence);\n _morphB.addScaledVector(_tempB.sub(_vB), influence);\n _morphC.addScaledVector(_tempC.sub(_vC), influence);\n }\n }\n _vA.add(_morphA);\n _vB.add(_morphB);\n _vC.add(_morphC);\n }\n if (object2.isSkinnedMesh) {\n object2.boneTransform(a2, _vA);\n object2.boneTransform(b2, _vB);\n object2.boneTransform(c2, _vC);\n }\n modifiedAttributeArray[a2 * 3 + 0] = _vA.x;\n modifiedAttributeArray[a2 * 3 + 1] = _vA.y;\n modifiedAttributeArray[a2 * 3 + 2] = _vA.z;\n modifiedAttributeArray[b2 * 3 + 0] = _vB.x;\n modifiedAttributeArray[b2 * 3 + 1] = _vB.y;\n modifiedAttributeArray[b2 * 3 + 2] = _vB.z;\n modifiedAttributeArray[c2 * 3 + 0] = _vC.x;\n modifiedAttributeArray[c2 * 3 + 1] = _vC.y;\n modifiedAttributeArray[c2 * 3 + 2] = _vC.z;\n }\n const geometry = object.geometry;\n const material = object.material;\n let a, b, c;\n const index = geometry.index;\n const positionAttribute = geometry.attributes.position;\n const morphPosition = geometry.morphAttributes.position;\n const morphTargetsRelative = geometry.morphTargetsRelative;\n const normalAttribute = geometry.attributes.normal;\n const morphNormal = geometry.morphAttributes.position;\n const groups = geometry.groups;\n const drawRange = geometry.drawRange;\n let i, j, il, jl;\n let group, groupMaterial;\n let start, end;\n const modifiedPosition = new Float32Array(positionAttribute.count * positionAttribute.itemSize);\n const modifiedNormal = new Float32Array(normalAttribute.count * normalAttribute.itemSize);\n if (index !== null) {\n if (Array.isArray(material)) {\n for (i = 0, il = groups.length; i < il; i++) {\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n start = Math.max(group.start, drawRange.start);\n end = Math.min(group.start + group.count, drawRange.start + drawRange.count);\n for (j = start, jl = end; j < jl; j += 3) {\n a = index.getX(j);\n b = index.getX(j + 1);\n c = index.getX(j + 2);\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else {\n start = Math.max(0, drawRange.start);\n end = Math.min(index.count, drawRange.start + drawRange.count);\n for (i = start, il = end; i < il; i += 3) {\n a = index.getX(i);\n b = index.getX(i + 1);\n c = index.getX(i + 2);\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else if (positionAttribute !== void 0) {\n if (Array.isArray(material)) {\n for (i = 0, il = groups.length; i < il; i++) {\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n start = Math.max(group.start, drawRange.start);\n end = Math.min(group.start + group.count, drawRange.start + drawRange.count);\n for (j = start, jl = end; j < jl; j += 3) {\n a = j;\n b = j + 1;\n c = j + 2;\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else {\n start = Math.max(0, drawRange.start);\n end = Math.min(positionAttribute.count, drawRange.start + drawRange.count);\n for (i = start, il = end; i < il; i += 3) {\n a = i;\n b = i + 1;\n c = i + 2;\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n }\n const morphedPositionAttribute = new Float32BufferAttribute(modifiedPosition, 3);\n const morphedNormalAttribute = new Float32BufferAttribute(modifiedNormal, 3);\n return {\n positionAttribute,\n normalAttribute,\n morphedPositionAttribute,\n morphedNormalAttribute\n };\n}\nfunction toCreasedNormals(geometry, creaseAngle = Math.PI / 3) {\n const creaseDot = Math.cos(creaseAngle);\n const hashMultiplier = (1 + 1e-10) * 100;\n const verts = [new Vector3(), new Vector3(), new Vector3()];\n const tempVec1 = new Vector3();\n const tempVec2 = new Vector3();\n const tempNorm = new Vector3();\n const tempNorm2 = new Vector3();\n function hashVertex(v) {\n const x = ~~(v.x * hashMultiplier);\n const y = ~~(v.y * hashMultiplier);\n const z = ~~(v.z * hashMultiplier);\n return `${x},${y},${z}`;\n }\n const resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;\n const posAttr = resultGeometry.attributes.position;\n const vertexMap = {};\n for (let i = 0, l = posAttr.count / 3; i < l; i++) {\n const i3 = 3 * i;\n const a = verts[0].fromBufferAttribute(posAttr, i3 + 0);\n const b = verts[1].fromBufferAttribute(posAttr, i3 + 1);\n const c = verts[2].fromBufferAttribute(posAttr, i3 + 2);\n tempVec1.subVectors(c, b);\n tempVec2.subVectors(a, b);\n const normal = new Vector3().crossVectors(tempVec1, tempVec2).normalize();\n for (let n = 0; n < 3; n++) {\n const vert = verts[n];\n const hash = hashVertex(vert);\n if (!(hash in vertexMap)) {\n vertexMap[hash] = [];\n }\n vertexMap[hash].push(normal);\n }\n }\n const normalArray = new Float32Array(posAttr.count * 3);\n const normAttr = new BufferAttribute(normalArray, 3, false);\n for (let i = 0, l = posAttr.count / 3; i < l; i++) {\n const i3 = 3 * i;\n const a = verts[0].fromBufferAttribute(posAttr, i3 + 0);\n const b = verts[1].fromBufferAttribute(posAttr, i3 + 1);\n const c = verts[2].fromBufferAttribute(posAttr, i3 + 2);\n tempVec1.subVectors(c, b);\n tempVec2.subVectors(a, b);\n tempNorm.crossVectors(tempVec1, tempVec2).normalize();\n for (let n = 0; n < 3; n++) {\n const vert = verts[n];\n const hash = hashVertex(vert);\n const otherNormals = vertexMap[hash];\n tempNorm2.set(0, 0, 0);\n for (let k = 0, lk = otherNormals.length; k < lk; k++) {\n const otherNorm = otherNormals[k];\n if (tempNorm.dot(otherNorm) > creaseDot) {\n tempNorm2.add(otherNorm);\n }\n }\n tempNorm2.normalize();\n normAttr.setXYZ(i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z);\n }\n }\n resultGeometry.setAttribute(\"normal\", normAttr);\n return resultGeometry;\n}\nexport {\n computeMorphedAttributes,\n estimateBytesUsed,\n interleaveAttributes,\n mergeBufferAttributes,\n mergeBufferGeometries,\n mergeVertices,\n toCreasedNormals,\n toTrianglesDrawMode\n};\n//# sourceMappingURL=BufferGeometryUtils.js.map\n","#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 { useMemo } from \"react\";\nimport transmission_pars_fragment from \"./shaders/transmission_pars_fragment.glsl\";\nimport transmission_fragment from \"./shaders/transmission_fragment.glsl\";\nimport { WOBBLE3D_PARAMS } from \".\";\nimport { MaterialProps } from \"../../types\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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\n/** You also need to rewrite the vertext shader of depthMaterial */\nconst rewriteVertex = (vertex: string) => {\n let shader = vertex;\n shader = shader.replace(\n \"#include \",\n `\n\t\tvec3 objectNormal = usf_Normal;\n\t\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t\t#endif`\n );\n // position\n shader = shader.replace(\n \"#include \",\n `\n\t\tvec3 transformed = usf_Position;`\n );\n\n // uniforms\n shader = shader.replace(\n \"void main() {\",\n `\n\t\tuniform float uTime;\n\t\tuniform float uWobblePositionFrequency;\n\t\tuniform float uWobbleTimeFrequency;\n\t\tuniform float uWobbleStrength;\n\t\tuniform float uWarpPositionFrequency;\n\t\tuniform float uWarpTimeFrequency;\n\t\tuniform float uWarpStrength;\n\t\tattribute vec4 tangent;\n\t\tvarying float vWobble;\n\t\tvarying vec2 vPosition;\n\t\t// edge\n\t\tvarying vec3 vEdgeNormal;\n\t\tvarying vec3 vEdgeViewPosition;\n\t\t#usf \n\t\tvoid main() {\n\t\t`\n );\n\n // vert\n shader = shader.replace(\n \"void main() {\",\n `\n\t\tvoid main() {\n\t\tvec3 usf_Position = position;\n\t\tvec3 usf_Normal = normal;\n\t\tvec3 biTangent = cross(normal, tangent.xyz);\n\t\t\n\t\t// Neighbours positions\n\t\tfloat shift = 0.01;\n\t\tvec3 positionA = usf_Position + tangent.xyz * shift;\n\t\tvec3 positionB = usf_Position + biTangent * shift;\n\t\t\n\t\t// wobble\n\t\tfloat wobble = (uWobbleStrength > 0.) ? getWobble(usf_Position) : 0.0;\n\t\tfloat wobblePositionA = (uWobbleStrength > 0.) ? getWobble(positionA) : 0.0;\n\t\tfloat wobblePositionB = (uWobbleStrength > 0.) ? getWobble(positionB) : 0.0;\n\t\t\n\t\tusf_Position += wobble * normal;\n\t\tpositionA += wobblePositionA * normal;\n\t\tpositionB += wobblePositionB * normal;\n\n\t\t// Compute normal\n\t\tvec3 toA = normalize(positionA - usf_Position);\n\t\tvec3 toB = normalize(positionB - usf_Position);\n\t\tusf_Normal = cross(toA, toB);\n\t\t\n\t\t// Varying\n\t\tvPosition = usf_Position.xy;\n\t\tvWobble = wobble/uWobbleStrength;\n\t\t\n\t\tvEdgeNormal = normalize(normalMatrix * usf_Normal);\n\t\tvec4 viewPosition = viewMatrix * modelMatrix * vec4(usf_Position, 1.0);\n\t\tvEdgeViewPosition = normalize(viewPosition.xyz);\n\t\t`\n );\n return shader;\n};\n\nexport type WobbleMaterialConstructor = new (opts: {\n [key: string]: any;\n}) => THREE.Material;\ntype WobbleMaterialParams =\n ConstructorParameters[0];\nexport interface WobbleMaterialProps\n extends MaterialProps {\n /** default:THREE.MeshPhysicalMaterial */\n baseMaterial?: T;\n materialParameters?: WobbleMaterialParams;\n /**\n * An optional callback that is executed immediately before the depth shader program is compiled.\n * @param shader — Source code of the shader\n * @param renderer — WebGLRenderer Context that is initializing the material\n */\n depthOnBeforeCompile?: (\n shader: THREE.Shader,\n renderer: THREE.WebGLRenderer\n ) => void;\n /**\n * 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 onBeforeCompile,\n depthOnBeforeCompile,\n isCustomTransmission = false,\n uniforms,\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 ...uniforms,\n },\n });\n\n mat.onBeforeCompile = (shader, renderer) => {\n Object.assign(shader.uniforms, mat.userData.uniforms);\n\n /********************\n\t\t\tvert\n\t\t\t********************/\n shader.vertexShader = rewriteVertex(shader.vertexShader);\n\n /********************\n\t\t\tfrag\n\t\t\t********************/\n // diffuse color , Manipulate color mixing ratio with `uColorMix`\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `\n\t\t\t\t\t#include \n\n\t\t\t\t\tif (uEdgeThreshold > 0.0) {\n\t\t\t\t\t\tfloat edgeThreshold = dot(vEdgeNormal, -vEdgeViewPosition);\n\t\t\t\t\t\tdiffuseColor = edgeThreshold < uEdgeThreshold ? vec4(uEdgeColor, 1.0) : mix(diffuseColor, usf_DiffuseColor, uColorMix);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdiffuseColor = mix(diffuseColor, usf_DiffuseColor, uColorMix);\n\t\t\t\t\t}\n\t\t\t\t`\n );\n\n // frag\n shader.fragmentShader = shader.fragmentShader.replace(\n \"void main() {\",\n `\n\t\t\t\tuniform vec3 uColor0;\n\t\t\t\tuniform vec3 uColor1;\n\t\t\t\tuniform vec3 uColor2;\n\t\t\t\tuniform vec3 uColor3;\n\t\t\t\tuniform float uColorMix;\n\t\t\t\tuniform float uEdgeThreshold;\n\t\t\t\tuniform vec3 uEdgeColor;\n\t\t\t\t\n\t\t\t\t// transmission\n\t\t\t\tuniform float uChromaticAberration; \n\t\t\t\tuniform float uAnisotropicBlur; \n\t\t\t\tuniform float uTime;\n\t\t\t\tuniform float uDistortion;\n\t\t\t\tuniform float uDistortionScale;\n\t\t\t\tuniform float uTemporalDistortion;\n\t\t\t\tuniform float uRefractionSamples;\n\t\t\t\t\n\t\t\t\tfloat rand(float n){return fract(sin(n) * 43758.5453123);}\n\t\t\t\t#usf \n\n\t\t\t\tvarying float vWobble;\n\t\t\t\tvarying vec2 vPosition;\n\t\t\t\tvarying vec3 vEdgeNormal;\n\t\t\t\tvarying vec3 vEdgeViewPosition;\n\t\t\t\t\n\t\t\t\tvoid main(){\n\t\t\t\t\tvec4 usf_DiffuseColor = vec4(1.0);\n\t\t\t\t\tfloat colorWobbleMix = smoothstep(-1.,1.,vWobble);\n\t\t\t\t\tvec2 colorPosMix = vec2(smoothstep(-1.,1.,vPosition.x),smoothstep(-1.,1.,vPosition.y));\n\t\t\t\t\n\t\t\t\t\tusf_DiffuseColor.rgb = mix(mix(uColor0, uColor1, colorPosMix.x), mix(uColor2, uColor3, colorPosMix.y), colorWobbleMix);\n\t\t\t\t`\n );\n\n // custom transmission\n if (mat.type === \"MeshPhysicalMaterial\" && isCustomTransmission) {\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `${transmission_pars_fragment}`\n );\n\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `${transmission_fragment}`\n );\n }\n\n setOnBeforeCompile(onBeforeCompile)(shader, renderer);\n };\n mat.needsUpdate = true;\n\n /*===============================================\n\t\tdepthMaterial\n\t\t===============================================*/\n const depthMat = new THREE.MeshDepthMaterial({\n depthPacking: THREE.RGBADepthPacking,\n });\n depthMat.onBeforeCompile = (shader, renderer) => {\n Object.assign(shader.uniforms, mat.userData.uniforms);\n shader.vertexShader = rewriteVertex(shader.vertexShader);\n setOnBeforeCompile(depthOnBeforeCompile)(shader, renderer);\n };\n depthMat.needsUpdate = true;\n\n return { material: mat, depthMaterial: depthMat };\n }, [\n materialParameters,\n baseMaterial,\n onBeforeCompile,\n depthOnBeforeCompile,\n uniforms,\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 onBeforeCompile,\n depthOnBeforeCompile,\n uniforms,\n}: UseCreateWobble3DProps &\n Create3DHooksProps &\n WobbleMaterialProps): UseCreateWobble3DReturn => {\n const wobbleGeometry = useMemo(() => {\n let geo = geometry || new THREE.IcosahedronGeometry(2, 20);\n geo = mergeVertices(geo);\n geo.computeTangents();\n return geo;\n }, [geometry]);\n const { material, depthMaterial } = useMaterial({\n baseMaterial,\n materialParameters,\n onBeforeCompile,\n depthOnBeforeCompile,\n uniforms,\n isCustomTransmission,\n });\n\n const mesh = useAddObject(scene, wobbleGeometry, material, THREE.Mesh);\n\n const userData = material.userData as Wobble3DMaterial;\n const updateValue = setUniform(userData);\n const 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 isSizeUpdate,\n camera,\n geometry,\n baseMaterial,\n materialParameters,\n uniforms,\n onBeforeCompile,\n depthOnBeforeCompile,\n isCustomTransmission,\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 uniforms,\n onBeforeCompile,\n depthOnBeforeCompile,\n isCustomTransmission,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n });\n\n const updateFx = useCallback(\n (\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","export type EasingTypes =\n | \"easeInSine\"\n | \"easeOutSine\"\n | \"easeInOutSine\"\n | \"easeInQuad\"\n | \"easeOutQuad\"\n | \"easeInOutQuad\"\n | \"easeInCubic\"\n | \"easeOutCubic\"\n | \"easeInOutCubic\"\n | \"easeInQuart\"\n | \"easeOutQuart\"\n | \"easeInOutQuart\"\n | \"easeInQuint\"\n | \"easeOutQuint\"\n | \"easeInOutQuint\"\n | \"easeInExpo\"\n | \"easeOutExpo\"\n | \"easeInOutExpo\"\n | \"easeInCirc\"\n | \"easeOutCirc\"\n | \"easeInOutCirc\"\n | \"easeInBack\"\n | \"easeOutBack\"\n | \"easeInOutBack\"\n | \"easeInElastic\"\n | \"easeOutElastic\"\n | \"easeInOutElastic\"\n | \"easeInBounce\"\n | \"easeOutBounce\"\n | \"easeInOutBounce\";\n\ntype EasingFunctions = {\n [K in EasingTypes]: (x: number) => number;\n};\n\n/**\n * from https://github.com/ai/easings.net\n */\nexport const Easing: EasingFunctions = Object.freeze({\n easeInSine(x: number): number {\n return 1 - Math.cos((x * Math.PI) / 2);\n },\n easeOutSine(x: number): number {\n return Math.sin((x * Math.PI) / 2);\n },\n easeInOutSine(x: number): number {\n return -(Math.cos(Math.PI * x) - 1) / 2;\n },\n easeInQuad(x: number): number {\n return x * x;\n },\n easeOutQuad(x: number): number {\n return 1 - (1 - x) * (1 - x);\n },\n easeInOutQuad(x: number): number {\n return x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2;\n },\n easeInCubic(x: number): number {\n return x * x * x;\n },\n easeOutCubic(x: number): number {\n return 1 - Math.pow(1 - x, 3);\n },\n easeInOutCubic(x: number): number {\n return x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2;\n },\n easeInQuart(x: number): number {\n return x * x * x * x;\n },\n easeOutQuart(x: number): number {\n return 1 - Math.pow(1 - x, 4);\n },\n easeInOutQuart(x: number): number {\n return x < 0.5 ? 8 * x * x * x * x : 1 - Math.pow(-2 * x + 2, 4) / 2;\n },\n easeInQuint(x: number): number {\n return x * x * x * x * x;\n },\n easeOutQuint(x: number): number {\n return 1 - Math.pow(1 - x, 5);\n },\n easeInOutQuint(x: number): number {\n return x < 0.5 ? 16 * x * x * x * x * x : 1 - Math.pow(-2 * x + 2, 5) / 2;\n },\n easeInExpo(x: number): number {\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\n },\n easeOutExpo(x: number): number {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n },\n easeInOutExpo(x: number): number {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? Math.pow(2, 20 * x - 10) / 2\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\n },\n easeInCirc(x: number): number {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n },\n easeOutCirc(x: number): number {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n },\n easeInOutCirc(x: number): number {\n return x < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\n },\n easeInBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return c3 * x * x * x - c1 * x * x;\n },\n easeOutBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return 1 + c3 * Math.pow(x - 1, 3) + c1 * Math.pow(x - 1, 2);\n },\n easeInOutBack(x: number): number {\n const c1 = 1.70158;\n const c2 = c1 * 1.525;\n\n return x < 0.5\n ? (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2\n : (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2;\n },\n easeInElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\n },\n easeOutElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1;\n },\n easeInOutElastic(x: number): number {\n const c5 = (2 * Math.PI) / 4.5;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * c5)) / 2\n : (Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * c5)) / 2 +\n 1;\n },\n easeInBounce(x: number): number {\n return 1 - Easing.easeOutBounce(1 - x);\n },\n easeOutBounce(x: number): number {\n const n1 = 7.5625;\n const d1 = 2.75;\n\n if (x < 1 / d1) {\n return n1 * x * x;\n } else if (x < 2 / d1) {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n } else if (x < 2.5 / d1) {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n } else {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n },\n easeInOutBounce(x: number): number {\n return x < 0.5\n ? (1 - Easing.easeOutBounce(1 - 2 * x)) / 2\n : (1 + Easing.easeOutBounce(2 * x - 1)) / 2;\n },\n});\n","import * as THREE from \"three\";\nimport { Easing, EasingTypes } from \"../libs/easing\";\nimport { useCallback } from \"react\";\n\n/** Returns a unique hash specific to the beat */\nfunction getHash(input: number) {\n let n = Math.sin(input * 12.9898) * 43758.5453;\n return n - Math.floor(n);\n}\n\ntype BeatValues = {\n beat: number;\n floor: number;\n fract: number;\n /** unique hash specific to the beat */\n hash: number;\n};\n\n/**\n * @param ease easing functions are referenced from https://github.com/ai/easings.net , default : \"easeOutQuart\"\n */\nexport const useBeat = (bpm: number, ease: EasingTypes = \"easeOutQuart\") => {\n const rhythm = bpm / 60;\n const easing = Easing[ease];\n const updateBeat = useCallback(\n (clock: THREE.Clock) => {\n let beat = clock.getElapsedTime() * rhythm;\n const floor = Math.floor(beat);\n const fract = easing(beat - floor);\n beat = fract + floor;\n const hash = getHash(floor);\n return {\n beat,\n floor,\n fract,\n hash,\n } as BeatValues;\n },\n [rhythm, easing]\n );\n return updateBeat;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo, useRef } from \"react\";\n\n/**\n * @param fps FPS you want to limit , default : `60`\n *\n * ```tsx\n * const limiter = useFPSLimiter(fps);\n * useFrame((props) => {\n * if (limiter(props.clock)) {\n *\t\t //some code\n * }\n * });\n * ```\n */\nexport const useFPSLimiter = (fps: number = 60) => {\n const interval = useMemo(() => 1 / Math.max(Math.min(fps, 60), 1), [fps]);\n const prevTime = useRef(null);\n\n const limiter = useCallback(\n (clock: THREE.Clock) => {\n const tick = clock.getElapsedTime();\n if (prevTime.current === null) {\n prevTime.current = tick;\n return true;\n }\n const deltaTime = tick - prevTime.current;\n if (deltaTime >= interval) {\n prevTime.current = tick;\n return true;\n }\n return false;\n },\n [interval]\n );\n\n return limiter;\n};\n","import { DomSyncerParams } from \"..\";\n\nexport const errorHandler = (params: DomSyncerParams) => {\n const domLength = params.dom?.length;\n const textureLength = params.texture?.length;\n\n if (!domLength || !textureLength) {\n return true;\n }\n\n if (domLength !== textureLength) {\n return true;\n }\n\n return false;\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec2 u_textureResolution;\nuniform vec2 u_resolution;\nuniform float u_borderRadius;\n\nvoid main() {\n\t// texuture color\n\tfloat screenAspect = u_resolution.x / u_resolution.y;\n\tfloat textureAspect = u_textureResolution.x / u_textureResolution.y;\n\tvec2 ratio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\n\tvec2 adjustedUv = vUv * ratio + (1.0 - ratio) * 0.5;\n\tvec3 textureColor = texture2D(u_texture, adjustedUv).rgb;\n\tfloat textureAlpha = texture2D(u_texture, adjustedUv).a;\n\n\t// Based on https://mofu-dev.com/en/blog/three-dom-alignment/\n\tfloat maxSide = max(u_resolution.x, u_resolution.y);\n\tfloat minSide = min(u_resolution.x, u_resolution.y);\n\tvec2 aspect = u_resolution / maxSide;\n\tvec2 alphaUv = vUv - 0.5;\n\n\tfloat borderRadius = min(u_borderRadius, minSide * 0.5);\n\tvec2 offset = vec2(borderRadius) / u_resolution;\n\tvec2 alphaXY = smoothstep(vec2(0.5 - offset), vec2(0.5 - offset - 0.001), abs(alphaUv));\n\tfloat alpha = min(1.0, alphaXY.x + alphaXY.y);\n\n\tvec2 alphaUv2 = abs(vUv - 0.5);\n\tfloat radius = borderRadius / maxSide;\n\talphaUv2 = (alphaUv2 - 0.5) * aspect + radius;\n\tfloat roundAlpha = smoothstep(radius + 0.001, radius, length(alphaUv2));\n\n\talpha = min(1.0, alpha + roundAlpha);\n\n\t// multiply texture alpha\n\talpha *= textureAlpha;\n\n\tgl_FragColor = vec4(textureColor, alpha);\n}\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"../\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"../shader/main.vert\";\nimport fragmentShader from \"../shader/main.frag\";\nimport { MaterialProps } from \"../../../fxs/types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../libs/constants\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n params: DomSyncerParams;\n size: Size;\n scene: THREE.Scene;\n} & MaterialProps) => {\n if (scene.children.length > 0) {\n scene.children.forEach((child) => {\n if (child instanceof THREE.Mesh) {\n child.geometry.dispose();\n child.material.dispose();\n }\n });\n scene.remove(...scene.children);\n }\n\n params.texture!.forEach((texture, i) => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: texture },\n u_textureResolution: {\n value: new THREE.Vector2(0, 0),\n },\n u_resolution: { value: new THREE.Vector2(0, 0) },\n u_borderRadius: {\n value: params.boderRadius![i] ? params.boderRadius![i] : 0.0,\n },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent.\n transparent: true,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n const mesh = new THREE.Mesh(new THREE.PlaneGeometry(1, 1), mat);\n scene.add(mesh);\n });\n};\n","import { useCallback, useRef } from \"react\";\nimport { DomSyncerParams } from \"..\";\n\nexport const useIntersectionHandler = () => {\n const intersectionObserverRef = useRef([]);\n const intersectionDomRef = useRef<(HTMLElement | Element | null)[]>([]);\n\n const intersectionHandler = useCallback(\n ({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n }: {\n isIntersectingRef: React.MutableRefObject;\n isIntersectingOnceRef: React.MutableRefObject;\n params: DomSyncerParams;\n }) => {\n if (intersectionObserverRef.current.length > 0) {\n intersectionObserverRef.current.forEach((observer, i) => {\n observer.unobserve(intersectionDomRef.current[i]!);\n });\n }\n\n intersectionDomRef.current = [];\n intersectionObserverRef.current = [];\n\n const newArr = new Array(params.dom!.length).fill(false);\n isIntersectingRef.current = [...newArr];\n isIntersectingOnceRef.current = [...newArr];\n\n params.dom!.forEach((dom, i) => {\n const callback = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n params.onIntersect![i] && params.onIntersect![i](entry);\n // Update the judgment after execution so that the judgment of isIntersectin can be used when executing onIntersect\n isIntersectingRef.current[i] = entry.isIntersecting;\n });\n };\n const observer = new IntersectionObserver(callback, {\n rootMargin: \"0px\",\n threshold: 0,\n });\n observer.observe(dom!);\n intersectionObserverRef.current.push(observer);\n intersectionDomRef.current.push(dom!);\n });\n },\n []\n );\n\n return intersectionHandler;\n};\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"..\";\nimport { Size } from \"@react-three/fiber\";\nimport {\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, samples, isSizeUpdate, uniforms, onBeforeCompile }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n const [params, setParams] = useParams({\n ...DOMSYNCER_PARAMS,\n updateKey: performance.now(),\n });\n\n const [DOMRects, updateDomRects] = useUpdateDomRect();\n\n // Avoid instancing vec2 every frame\n const resolutionRef = useRef(new THREE.Vector2(0, 0));\n\n // Update monitored doms according to the dependency array\n const [refreshTrigger, setRefreshTrigger] = useState(true);\n useMemo(\n () => setRefreshTrigger(true),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n dependencies\n );\n\n // If the dependencies have been updated but the key has not been updated, skip processing and return an empty texture\n const updateKey = useRef(null);\n const emptyTexture = useMemo(() => 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 uniforms,\n onBeforeCompile,\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 uniforms,\n intersectionHandler,\n onBeforeCompile,\n refreshTrigger,\n scene,\n params,\n isIntersectingOnceRef,\n isIntersectingRef,\n emptyTexture,\n updateParams,\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 { UseFboProps, renderFBO, FBO_OPTION } from \"../utils/useSingleFBO\";\n\ntype UpdateCopyFunction = (\n gl: THREE.WebGLRenderer,\n index: number,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseCopyTextureReturn = [THREE.WebGLRenderTarget[], UpdateCopyFunction];\n\n/**\n * Generate an FBO array to copy the texture.\n * @param dpr If dpr is set, dpr will be multiplied, default : `false`\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false`\n * @param length The number of FBOs to create\n * @returns [THREE.WebGLRenderTarget[] , updateCopyTexture] - Receives the RenderTarget array as the first argument and the update function as the second argument. `updateCopyTexture()` receives gl as the first argument and the index of the texture you want to copy as the second argument.\n */\nexport const useCopyTexture = (\n {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n }: UseFboProps,\n length: number\n): UseCopyTextureReturn => {\n const renderTargetArr = useRef([]);\n const resolution = useResolution(size, dpr);\n\n renderTargetArr.current = useMemo(() => {\n return Array.from({ length }, () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [length]);\n\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","setUniform","material","key","value","uniforms","setCustomUniform","customParams","useAddObject","scene","geometry","Proto","object3D","obj","useEffect","ISDEV","MATERIAL_BASIC_PARAMS","DEFAULT_TEXTURE","wobble3D_default","snoise_default","coverTexture_default","fxBlending_default","planeVert_default","SHADER_CHUNK","wobble3D","snoise","coverTexture","fxBlending","planeVert","includePattern","includeReplacer","match","include","string","resolveIncludes","resolveShaders","shader","setOnBeforeCompile","onBeforeCompile","renderer","useMesh","mat","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_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","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","iterations","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","mergeVertices","tolerance","hashToIndex","indices","vertexCount","nextIndex","attributeNames","attrArrays","morphAttrsArrays","newIndices","getters","l","name","morphAttr","decimalShift","shiftMultiplier","hash","k","newarray","newMorphArrays","getterFunc","m","ml","result","oldAttribute","buffer","BufferAttribute","oldMorphAttribute","buffer2","morphAttribute","transmission_pars_fragment_default","transmission_fragment_default","rewriteVertex","vertex","baseMaterial","materialParameters","depthOnBeforeCompile","isCustomTransmission","depthMaterial","WOBBLE3D_PARAMS","transmission_pars_fragment","transmission_fragment","depthMat","useCreateWobble3D","wobbleGeometry","userData","useWobble3D","RootState","useAddMesh","Easing","x","c2","c4","c5","getHash","input","n","useBeat","bpm","ease","rhythm","easing","beat","floor","fract","useFPSLimiter","fps","interval","prevTime","tick","errorHandler","domLength","textureLength","createMesh","child","useIntersectionHandler","intersectionObserverRef","intersectionDomRef","isIntersectingRef","isIntersectingOnceRef","observer","newArr","dom","callback","entries","entry","useUpdateDomRect","domRects","updateDomRects","resolutionRef","domElement","rect","useIsIntersecting","isIntersecting","once","createUseDomView","onView","onHidden","isView","id","filterIntersection","item","DOMSYNCER_PARAMS","useDomSyncer","dependencies","DOMRects","refreshTrigger","setRefreshTrigger","useState","updateKey","emptyTexture","intersectionHandler","useDomView","useCopyTexture","length","renderTargetArr","updateCopyTexture"],"mappings":"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","x_google_ignoreList":[123]} \ 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 deleted file mode 100644 index a32273fc..00000000 --- a/packages/use-shader-fx/build/use-shader-fx.umd.cjs +++ /dev/null @@ -1,1571 +0,0 @@ -(function(C,ue){typeof exports=="object"&&typeof module<"u"?ue(exports,require("three"),require("react")):typeof define=="function"&&define.amd?define(["exports","three","react"],ue):(C=typeof globalThis<"u"?globalThis:C||self,ue(C["use-shader-fx"]={},C.THREE,C.React))})(this,function(C,ue,i){"use strict";function $e(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 o=$e(ue);var je="#usf ",We=`precision highp float; - -uniform sampler2D uBuffer; -uniform sampler2D uTexture; -uniform bool uIsTexture; -uniform sampler2D uMap; -uniform bool uIsMap; -uniform float uMapIntensity; -uniform float uRadius; -uniform float uDissipation; -uniform vec2 uResolution; -uniform float uSmudge; -uniform vec2 uMouse; -uniform vec2 uPrevMouse; -uniform vec2 uVelocity; -uniform vec3 uColor; -uniform float uMotionBlur; -uniform int uMotionSample; -uniform bool uIsCursor; -uniform float uPressureStart; -uniform float uPressureEnd; - -varying vec2 vUv; - -float isOnLine(vec2 point, vec2 start, vec2 end, float radius, float pressureStart, float pressureEnd) { - - float aspect = uResolution.x / uResolution.y; - - point.x *= aspect; - start.x *= aspect; - end.x *= aspect; - - vec2 dir = normalize(end - start); - vec2 n = vec2(dir.y, -dir.x); - vec2 p0 = point - start; - - float distToLine = abs(dot(p0, n)); - float distAlongLine = dot(p0, dir); - float totalLength = length(end - start); - - float progress = clamp(distAlongLine / totalLength, 0.0, 1.0); - float pressure = mix(pressureStart, pressureEnd, progress); - radius = min(radius,radius * pressure); - - float distFromStart = length(point - start); - float distFromEnd = length(point - end); - - bool withinLine = (distToLine < radius && distAlongLine > 0.0 && distAlongLine < totalLength) || distFromStart < radius || distFromEnd < radius; - - return float(withinLine); -} - -vec4 createSmudge(vec2 uv){ - vec2 offsets[9]; - offsets[0] = vec2(-1, -1); offsets[1] = vec2( 0, -1); offsets[2] = vec2( 1, -1); - offsets[3] = vec2(-1, 0); offsets[4] = vec2( 0, 0); offsets[5] = vec2( 1, 0); - offsets[6] = vec2(-1, 1); offsets[7] = vec2( 0, 1); offsets[8] = vec2( 1, 1); - - for(int i = 0; i < 9; i++) { - offsets[i] = (offsets[i] * uSmudge) / uResolution; - } - vec4 smudgedColor = vec4(0.); - for(int i = 0; i < 9; i++) { - smudgedColor += texture2D(uBuffer, uv + offsets[i]); - } - return smudgedColor / 9.0; -} - -vec4 createMotionBlur(vec2 uv , vec4 baseColor, vec2 velocity) { - vec2 scaledV = velocity * uMotionBlur; - for(int i = 1; i < uMotionSample; i++) { - float t = float(i) / float(uMotionSample - 1); - vec2 offset = t * scaledV / uResolution; - baseColor += texture2D(uBuffer, uv + offset); - } - return baseColor / float(uMotionSample); -} - -void main() { - - vec2 uv = vUv; - if(uIsMap){ - vec2 mapColor = texture2D(uMap, uv).rg; - vec2 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; - } - vec2 suv = uv*2.-1.; - - vec2 velocity = uVelocity * uResolution; - - float radius = max(0.0,uRadius); - - vec4 smudgedColor = uSmudge > 0. ? createSmudge(uv) : texture2D(uBuffer, uv); - - vec4 motionBlurredColor = uMotionBlur > 0. ? createMotionBlur(uv,smudgedColor, velocity) : smudgedColor; - - vec4 bufferColor = motionBlurredColor; - bufferColor.a = bufferColor.a < 1e-10 ? 0.0 : bufferColor.a * uDissipation; - - vec4 brushColor = uIsTexture ? texture2D(uTexture, uv) : vec4(uColor,1.); - - float onLine = isOnLine(suv, uPrevMouse, uMouse, radius, uPressureStart,uPressureEnd); - float isOnLine = length(velocity) > 0. ? onLine : uIsCursor ? onLine : 0.; - - vec4 finalColor = mix(bufferColor, brushColor, isOnLine); - - gl_FragColor = finalColor; -}`;const X=(e,n=!1)=>{const t=n?e.width*n:e.width,r=n?e.height*n:e.height;return i.useMemo(()=>new o.Vector2(t,r),[t,r])},R=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 u=i.useMemo(()=>{const m=new r(n,t);return e&&e.add(m),m},[n,t,r,e]);return i.useEffect(()=>()=>{e&&e.remove(u),n.dispose(),t.dispose()},[e,n,t,u]),u},De=process.env.NODE_ENV==="development",z={transparent:!1,depthTest:!1,depthWrite:!1},D=new o.DataTexture(new Uint8Array([0,0,0,0]),1,1,o.RGBAFormat);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;} - -vec4 grad4(float j, vec4 ip) -{ - const vec4 ones = vec4(1.0, 1.0, 1.0, -1.0); - vec4 p,s; - - p.xyz = floor( fract (vec3(j) * ip.xyz) * 7.0) * ip.z - 1.0; - p.w = 1.5 - dot(abs(p.xyz), ones.xyz); - s = vec4(lessThan(p, vec4(0.0))); - p.xyz = p.xyz + (s.xyz*2.0 - 1.0) * s.www; - - return p; -} - -float simplexNoise4d(vec4 v) -{ - const vec2 C = vec2( 0.138196601125010504, - 0.309016994374947451); - - vec4 i = floor(v + dot(v, C.yyyy) ); - vec4 x0 = v - i + dot(i, C.xxxx); - - - - - vec4 i0; - - vec3 isX = step( x0.yzw, x0.xxx ); - vec3 isYZ = step( x0.zww, x0.yyz ); - - i0.x = isX.x + isX.y + isX.z; - i0.yzw = 1.0 - isX; - - - i0.y += isYZ.x + isYZ.y; - i0.zw += 1.0 - isYZ.xy; - - i0.z += isYZ.z; - i0.w += 1.0 - isYZ.z; - - - vec4 i3 = clamp( i0, 0.0, 1.0 ); - vec4 i2 = clamp( i0-1.0, 0.0, 1.0 ); - vec4 i1 = clamp( i0-2.0, 0.0, 1.0 ); - - - vec4 x1 = x0 - i1 + 1.0 * C.xxxx; - vec4 x2 = x0 - i2 + 2.0 * C.xxxx; - vec4 x3 = x0 - i3 + 3.0 * C.xxxx; - vec4 x4 = x0 - 1.0 + 4.0 * C.xxxx; - - - i = mod(i, 289.0); - float j0 = permute( permute( permute( permute(i.w) + i.z) + i.y) + i.x); - vec4 j1 = permute( permute( permute( permute ( - i.w + vec4(i1.w, i2.w, i3.w, 1.0 )) - + i.z + vec4(i1.z, i2.z, i3.z, 1.0 )) - + i.y + vec4(i1.y, i2.y, i3.y, 1.0 )) - + i.x + vec4(i1.x, i2.x, i3.x, 1.0 )); - - - - - vec4 ip = vec4(1.0/294.0, 1.0/49.0, 1.0/7.0, 0.0) ; - - vec4 p0 = grad4(j0, ip); - vec4 p1 = grad4(j1.x, ip); - vec4 p2 = grad4(j1.y, ip); - vec4 p3 = grad4(j1.z, ip); - vec4 p4 = grad4(j1.w, ip); - - - vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3))); - p0 *= norm.x; - p1 *= norm.y; - p2 *= norm.z; - p3 *= norm.w; - p4 *= taylorInvSqrt(dot(p4,p4)); - - - vec3 m0 = max(0.6 - vec3(dot(x0,x0), dot(x1,x1), dot(x2,x2)), 0.0); - vec2 m1 = max(0.6 - vec2(dot(x3,x3), dot(x4,x4) ), 0.0); - m0 = m0 * m0; - m1 = m1 * m1; - return 49.0 * ( dot(m0*m0, vec3( dot( p0, x0 ), dot( p1, x1 ), dot( p2, x2 ))) - + dot(m1*m1, vec2( dot( p3, x3 ), dot( p4, x4 ) ) ) ) ; - -} - -float getWobble(vec3 position) -{ - vec3 warpedPosition = position; - warpedPosition += simplexNoise4d( - vec4( - position * uWarpPositionFrequency, - uTime * uWarpTimeFrequency - ) - ) * uWarpStrength; - - return simplexNoise4d(vec4( - warpedPosition * uWobblePositionFrequency, - uTime * uWobbleTimeFrequency - )) * uWobbleStrength; -}`,Ne=`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); - j *= .125; - r.x = fract(512.0*j); - j *= .125; - r.y = fract(512.0*j); - return r-0.5; -} - -const float F3 = 0.3333333; -const float G3 = 0.1666667; - -float snoise(vec3 p) { - - vec3 s = floor(p + dot(p, vec3(F3))); - vec3 x = p - s + dot(s, vec3(G3)); - - vec3 e = step(vec3(0.0), x - x.yzx); - vec3 i1 = e*(1.0 - e.zxy); - vec3 i2 = 1.0 - e.zxy*(1.0 - e); - - vec3 x1 = x - i1 + G3; - vec3 x2 = x - i2 + 2.0*G3; - vec3 x3 = x - 1.0 + 3.0*G3; - - vec4 w, d; - - w.x = dot(x, x); - w.y = dot(x1, x1); - w.z = dot(x2, x2); - w.w = dot(x3, x3); - - w = max(0.6 - w, 0.0); - - d.x = dot(random3(s), x); - d.y = dot(random3(s + i1), x1); - d.z = dot(random3(s + i2), x2); - d.w = dot(random3(s + 1.0), x3); - - w *= w; - w *= w; - d *= w; - - return dot(d, vec4(52.0)); -} - -float snoiseFractal(vec3 m) { - return 0.5333333* snoise(m) - +0.2666667* snoise(2.0*m) - +0.1333333* snoise(4.0*m) - +0.0666667* snoise(8.0*m); -}`,Ge=`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; -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;`,Xe=`precision highp float; - -varying vec2 vUv; - -void main() { - vUv = uv; - gl_Position = vec4(position, 1.0); -}`;const He={wobble3D:qe,snoise:Ne,coverTexture:Ge,fxBlending:Ke,planeVert:Xe},Ye=/^[ \t]*#usf +<([\w\d./]+)>/gm;function Qe(e,n){let t=He[n]||"";return be(t)}function be(e){return e.replace(Ye,Qe)}const Ze=e=>{e.vertexShader=be(e.vertexShader),e.fragmentShader=be(e.fragmentShader)},B=e=>(n,t)=>{e&&e(n,t),Ze(n)},Je=({scene:e,size:n,dpr:t,uniforms:r,onBeforeCompile:u})=>{const m=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),l=i.useMemo(()=>{const g=new o.ShaderMaterial({uniforms:{uBuffer:{value:D},uResolution:{value:new o.Vector2(0,0)},uTexture:{value:D},uIsTexture:{value:!1},uMap:{value:D},uIsMap:{value:!1},uMapIntensity:{value:Z.mapIntensity},uRadius:{value:Z.radius},uSmudge:{value:Z.smudge},uDissipation:{value:Z.dissipation},uMotionBlur:{value:Z.motionBlur},uMotionSample:{value:Z.motionSample},uMouse:{value:new o.Vector2(-10,-10)},uPrevMouse:{value:new o.Vector2(-10,-10)},uVelocity:{value:new o.Vector2(0,0)},uColor:{value:Z.color},uIsCursor:{value:!1},uPressureStart:{value:1},uPressureEnd:{value:1},...r},vertexShader:je,fragmentShader:We,...z,transparent:!0});return g.onBeforeCompile=B(u),g},[u,r]),s=X(n,t);R(l)("uResolution",s.clone());const v=L(e,m,l,o.Mesh);return{material:l,mesh:v}},en=(e,n)=>{const t=n,r=e/n,[u,m]=[t*r/2,t/2];return{width:u,height:m,near:-1e3,far:1e3}},k=(e,n="OrthographicCamera")=>{const t=X(e),{width:r,height:u,near:m,far:l}=en(t.x,t.y);return i.useMemo(()=>n==="OrthographicCamera"?new o.OrthographicCamera(-r,r,u,-u,m,l):new o.PerspectiveCamera(50,r/u),[r,u,m,l,n])},ge=(e=0)=>{const n=i.useRef(new o.Vector2(0,0)),t=i.useRef(new o.Vector2(0,0)),r=i.useRef(new o.Vector2(0,0)),u=i.useRef(0),m=i.useRef(new o.Vector2(0,0)),l=i.useRef(!1);return i.useCallback(v=>{const g=performance.now();let d;l.current&&e?(r.current=r.current.lerp(v,1-e),d=r.current.clone()):(d=v.clone(),r.current=d),u.current===0&&(u.current=g,n.current=d);const y=Math.max(1,g-u.current);u.current=g,m.current.copy(d).sub(n.current).divideScalar(y);const M=m.current.length()>0,a=l.current?n.current.clone():d;return!l.current&&M&&(l.current=!0),n.current=d,{currentPointer:d,prevPointer:a,diffPointer:t.current.subVectors(d,a),velocity:m.current,isVelocityUpdate:M}},[e])},$=e=>{const n=u=>Object.values(u).some(m=>typeof m=="function"),t=i.useRef(n(e)?e:structuredClone(e)),r=i.useCallback(u=>{if(u!==void 0)for(const m in u){const l=m;l in t.current&&u[l]!==void 0&&u[l]!==null?t.current[l]=u[l]:console.error(`"${String(l)}" does not exist in the params. or "${String(l)}" is null | undefined`)}},[]);return[t.current,r]},me={minFilter:o.LinearFilter,magFilter:o.LinearFilter,type:o.HalfFloatType,stencilBuffer:!1},he=({gl:e,fbo:n,scene:t,camera:r,onBeforeRender:u,onSwap:m})=>{e.setRenderTarget(n),u(),e.clear(),e.render(t,r),m&&m(),e.setRenderTarget(null),e.clear()},j=({scene:e,camera:n,size:t,dpr:r=!1,isSizeUpdate:u=!1,samples:m=0,depthBuffer:l=!1,depthTexture:s=!1})=>{var y;const v=i.useRef(),g=X(t,r);v.current=i.useMemo(()=>{const M=new o.WebGLRenderTarget(g.x,g.y,{...me,samples:m,depthBuffer:l});return s&&(M.depthTexture=new o.DepthTexture(g.x,g.y,o.FloatType)),M},[]),u&&((y=v.current)==null||y.setSize(g.x,g.y)),i.useEffect(()=>{const M=v.current;return()=>{M==null||M.dispose()}},[]);const d=i.useCallback((M,a)=>{const h=v.current;return he({gl:M,fbo:h,scene:e,camera:n,onBeforeRender:()=>a&&a({read:h.texture})}),h.texture},[e,n]);return[v.current,d]},re=({scene:e,camera:n,size:t,dpr:r=!1,isSizeUpdate:u=!1,samples:m=0,depthBuffer:l=!1,depthTexture:s=!1})=>{var M,a;const v=i.useRef({read:null,write:null,swap:function(){let h=this.read;this.read=this.write,this.write=h}}),g=X(t,r),d=i.useMemo(()=>{const h=new o.WebGLRenderTarget(g.x,g.y,{...me,samples:m,depthBuffer:l}),c=new o.WebGLRenderTarget(g.x,g.y,{...me,samples:m,depthBuffer:l});return s&&(h.depthTexture=new o.DepthTexture(g.x,g.y,o.FloatType),c.depthTexture=new o.DepthTexture(g.x,g.y,o.FloatType)),{read:h,write:c}},[]);v.current.read=d.read,v.current.write=d.write,u&&((M=v.current.read)==null||M.setSize(g.x,g.y),(a=v.current.write)==null||a.setSize(g.x,g.y)),i.useEffect(()=>{const h=v.current;return()=>{var c,p;(c=h.read)==null||c.dispose(),(p=h.write)==null||p.dispose()}},[]);const y=i.useCallback((h,c)=>{var f;const p=v.current;return he({gl:h,scene:e,camera:n,fbo:p.write,onBeforeRender:()=>c&&c({read:p.read.texture,write:p.write.texture}),onSwap:()=>p.swap()}),(f=p.read)==null?void 0:f.texture},[e,n]);return[{read:v.current.read,write:v.current.write},y]},U=e=>typeof e=="number"?{shader:e,fbo:e}:{shader:e.shader??!1,fbo:e.fbo??!1},Z=Object.freeze({texture:!1,map:!1,mapIntensity:.1,radius:.05,smudge:0,dissipation:1,motionBlur:0,motionSample:5,color:new o.Vector3(1,0,0),isCursor:!1,pressure:1,pointerValues:!1}),nn=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=Je({scene:s,size:e,dpr:l.shader,uniforms:u,onBeforeCompile:m}),d=k(e),y=ge(),[M,a]=re({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[h,c]=$(Z),p=i.useRef(null),f=R(v),w=V(v),b=i.useCallback((S,_)=>{c(S),w(_)},[c,w]);return[i.useCallback((S,_,T)=>{const{gl:I,pointer:A}=S;b(_,T),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 F=h.pointerValues||y(A);F.isVelocityUpdate&&(f("uMouse",F.currentPointer),f("uPrevMouse",F.prevPointer)),f("uVelocity",F.velocity);const P=typeof h.color=="function"?h.color(F.velocity):h.color;return f("uColor",P),f("uIsCursor",h.isCursor),f("uPressureEnd",h.pressure),p.current===null&&(p.current=h.pressure),f("uPressureStart",p.current),p.current=h.pressure,a(I,({read:O})=>{f("uBuffer",O)})},[f,y,a,h,b]),b,{scene:s,mesh:g,material:v,camera:d,renderTarget:M,output:M.read.texture}]};var J=`varying vec2 vUv; -varying vec2 vL; -varying vec2 vR; -varying vec2 vT; -varying vec2 vB; -uniform vec2 texelSize; - -void main () { - vUv = uv; - vL = vUv - vec2(texelSize.x, 0.0); - vR = vUv + vec2(texelSize.x, 0.0); - vT = vUv + vec2(0.0, texelSize.y); - vB = vUv - vec2(0.0, texelSize.y); - gl_Position = vec4(position, 1.0); -}`,tn=`precision highp float; - -void main(){ - gl_FragColor = vec4(0.0); -}`;const rn=()=>i.useMemo(()=>new o.ShaderMaterial({vertexShader:J,fragmentShader:tn,...z}),[]);var on=`precision highp float; - -varying vec2 vUv; -uniform sampler2D uVelocity; -uniform sampler2D uSource; -uniform vec2 texelSize; -uniform float dt; -uniform float dissipation; - -void main () { - vec2 coord = vUv - dt * texture2D(uVelocity, vUv).xy * texelSize; - gl_FragColor = vec4(dissipation * texture2D(uSource, coord).rgb,1.); -}`;const an=({onBeforeCompile:e,uniforms:n})=>i.useMemo(()=>{const r=new o.ShaderMaterial({uniforms:{uVelocity:{value:D},uSource:{value:D},texelSize:{value:new o.Vector2},dt:{value:Se},dissipation:{value:0},...n},vertexShader:J,fragmentShader:on,...z});return r.onBeforeCompile=B(e),r},[e,n]);var un=`precision highp float; - -varying vec2 vUv; -varying vec2 vL; -varying vec2 vR; -varying vec2 vT; -varying vec2 vB; -uniform sampler2D uVelocity; - -vec2 sampleVelocity(in vec2 uv) { - vec2 clampedUV = clamp(uv, 0.0, 1.0); - vec2 multiplier = vec2(1.0, 1.0); - multiplier.x = uv.x < 0.0 || uv.x > 1.0 ? -1.0 : 1.0; - multiplier.y = uv.y < 0.0 || uv.y > 1.0 ? -1.0 : 1.0; - return multiplier * texture2D(uVelocity, clampedUV).xy; -} - -void main () { - float L = sampleVelocity(vL).x; - float R = sampleVelocity(vR).x; - float T = sampleVelocity(vT).y; - float B = sampleVelocity(vB).y; - float div = 0.5 * (R - L + T - B); - gl_FragColor = vec4(div, 0.0, 0.0, 1.0); -}`;const sn=({onBeforeCompile:e,uniforms:n})=>i.useMemo(()=>{const r=new o.ShaderMaterial({uniforms:{uVelocity:{value:null},texelSize:{value:new o.Vector2},...n},vertexShader:J,fragmentShader:un,...z});return r.onBeforeCompile=B(e),r},[e,n]);var ln=`precision highp float; - -varying vec2 vUv; -varying vec2 vL; -varying vec2 vR; -varying vec2 vT; -varying vec2 vB; -uniform sampler2D uPressure; -uniform sampler2D uDivergence; - -void main () { - float L = texture2D(uPressure, clamp(vL,0.,1.)).x; - float R = texture2D(uPressure, clamp(vR,0.,1.)).x; - float T = texture2D(uPressure, clamp(vT,0.,1.)).x; - float B = texture2D(uPressure, clamp(vB,0.,1.)).x; - float C = texture2D(uPressure, vUv).x; - 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 cn=({onBeforeCompile:e,uniforms:n})=>i.useMemo(()=>{const r=new o.ShaderMaterial({uniforms:{uPressure:{value:null},uDivergence:{value:null},texelSize:{value:new o.Vector2},...n},vertexShader:J,fragmentShader:ln,...z});return r.onBeforeCompile=B(e),r},[e,n]);var vn=`precision highp float; - -varying vec2 vUv; -varying vec2 vL; -varying vec2 vR; -varying vec2 vT; -varying vec2 vB; -uniform sampler2D uVelocity; - -void main () { - float L = texture2D(uVelocity, vL).y; - float R = texture2D(uVelocity, vR).y; - float T = texture2D(uVelocity, vT).x; - float B = texture2D(uVelocity, vB).x; - float vorticity = R - L - T + B; - gl_FragColor = vec4(vorticity, 0.0, 0.0, 1.0); -}`;const mn=({onBeforeCompile:e,uniforms:n})=>i.useMemo(()=>{const r=new o.ShaderMaterial({uniforms:{uVelocity:{value:null},texelSize:{value:new o.Vector2},...n},vertexShader:J,fragmentShader:vn,...z});return r.onBeforeCompile=B(e),r},[e,n]);var pn=`precision highp float; - -varying vec2 vUv; -varying vec2 vT; -varying vec2 vB; -uniform sampler2D uVelocity; -uniform sampler2D uCurl; -uniform float curl; -uniform float dt; - -void main () { - float T = texture2D(uCurl, vT).x; - float B = texture2D(uCurl, vB).x; - float C = texture2D(uCurl, vUv).x; - vec2 force = vec2(abs(T) - abs(B), 0.0); - 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 fn=({onBeforeCompile:e,uniforms:n})=>i.useMemo(()=>{const r=new o.ShaderMaterial({uniforms:{uVelocity:{value:null},uCurl:{value:null},curl:{value:0},dt:{value:Se},texelSize:{value:new o.Vector2},...n},vertexShader:J,fragmentShader:pn,...z});return r.onBeforeCompile=B(e),r},[e,n]);var dn=`precision highp float; - -varying vec2 vUv; -uniform sampler2D uTexture; -uniform float value; - -void main () { - gl_FragColor = value * texture2D(uTexture, vUv); -}`;const gn=({onBeforeCompile:e,uniforms:n})=>i.useMemo(()=>{const r=new o.ShaderMaterial({uniforms:{uTexture:{value:D},value:{value:0},texelSize:{value:new o.Vector2},...n},vertexShader:J,fragmentShader:dn,...z});return r.onBeforeCompile=B(e),r},[e,n]);var hn=`precision highp float; - -varying vec2 vUv; -varying vec2 vL; -varying vec2 vR; -varying vec2 vT; -varying vec2 vB; -uniform sampler2D uPressure; -uniform sampler2D uVelocity; - -void main () { - float L = texture2D(uPressure, clamp(vL,0.,1.)).x; - float R = texture2D(uPressure, clamp(vR,0.,1.)).x; - float T = texture2D(uPressure, clamp(vT,0.,1.)).x; - float B = texture2D(uPressure, clamp(vB,0.,1.)).x; - vec2 velocity = texture2D(uVelocity, vUv).xy; - velocity.xy -= vec2(R - L, T - B); - gl_FragColor = vec4(velocity, 0.0, 1.0); -}`;const xn=({onBeforeCompile:e,uniforms:n})=>i.useMemo(()=>{const r=new o.ShaderMaterial({uniforms:{uPressure:{value:D},uVelocity:{value:D},texelSize:{value:new o.Vector2},...n},vertexShader:J,fragmentShader:hn,...z});return r.onBeforeCompile=B(e),r},[e,n]);var Mn=`precision highp float; - -varying vec2 vUv; -uniform sampler2D uTarget; -uniform float aspectRatio; -uniform vec3 color; -uniform vec2 point; -uniform float radius; - -void main () { - vec2 nPoint = (point + vec2(1.0)) * 0.5; - vec2 p = vUv - nPoint.xy; - p.x *= aspectRatio; - vec3 splat = exp(-dot(p, p) / radius) * color; - vec3 base = texture2D(uTarget, vUv).xyz; - gl_FragColor = vec4(base + splat, 1.0); -}`;const yn=({onBeforeCompile:e,uniforms:n})=>i.useMemo(()=>{const r=new o.ShaderMaterial({uniforms:{uTarget:{value:D},aspectRatio:{value:0},color:{value:new o.Vector3},point:{value:new o.Vector2},radius:{value:0},texelSize:{value:new o.Vector2},...n},vertexShader:J,fragmentShader:Mn,...z});return r.onBeforeCompile=B(e),r},[e,n]),ee=(e,n)=>e(n??{}),bn=({scene:e,size:n,dpr:t,customFluidProps:r})=>{const u=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),{curl:m,vorticity:l,advection:s,divergence:v,pressure:g,clear:d,gradientSubtract:y,splat:M}=r??{},a=ee(rn),h=a.clone(),c=ee(mn,m),p=ee(fn,l),f=ee(an,s),w=ee(sn,v),b=ee(cn,g),x=ee(gn,d),S=ee(xn,y),_=ee(yn,M),T=i.useMemo(()=>({vorticityMaterial:p,curlMaterial:c,advectionMaterial:f,divergenceMaterial:w,pressureMaterial:b,clearMaterial:x,gradientSubtractMaterial:S,splatMaterial:_}),[p,c,f,w,b,x,S,_]),I=X(n,t);i.useMemo(()=>{R(T.splatMaterial)("aspectRatio",I.x/I.y);for(const P of Object.values(T))R(P)("texelSize",new o.Vector2(1/I.x,1/I.y))},[I,T]);const A=L(e,u,a,o.Mesh);i.useMemo(()=>{a.dispose(),A.material=h},[a,A,h]),i.useEffect(()=>()=>{for(const P of Object.values(T))P.dispose()},[T]);const F=i.useCallback(P=>{A.material=P,A.material.needsUpdate=!0},[A]);return{materials:T,setMeshMaterial:F,mesh:A}},Se=.016,Pe=Object.freeze({density_dissipation:.98,velocity_dissipation:.99,velocity_acceleration:10,pressure_dissipation:.9,pressure_iterations:20,curl_strength:35,splat_radius:.002,fluid_color:new o.Vector3(1,1,1),pointerValues:!1}),Sn=({size:e,dpr:n,samples:t,isSizeUpdate:r,customFluidProps:u})=>{const m=U(n),l=i.useMemo(()=>new o.Scene,[]),{materials:s,setMeshMaterial:v,mesh:g}=bn({scene:l,size:e,dpr:m.shader,customFluidProps:u}),d=k(e),y=ge(),M=i.useMemo(()=>({scene:l,camera:d,dpr:m.fbo,size:e,samples:t,isSizeUpdate:r}),[l,d,e,t,m.fbo,r]),[a,h]=re(M),[c,p]=re(M),[f,w]=j(M),[b,x]=j(M),[S,_]=re(M),T=i.useRef(new o.Vector2(0,0)),I=i.useRef(new o.Vector3(0,0,0)),[A,F]=$(Pe),P=i.useMemo(()=>({advection:R(s.advectionMaterial),splat:R(s.splatMaterial),curl:R(s.curlMaterial),vorticity:R(s.vorticityMaterial),divergence:R(s.divergenceMaterial),clear:R(s.clearMaterial),pressure:R(s.pressureMaterial),gradientSubtract:R(s.gradientSubtractMaterial)}),[s]),O=i.useMemo(()=>({advection:V(s.advectionMaterial),splat:V(s.splatMaterial),curl:V(s.curlMaterial),vorticity:V(s.vorticityMaterial),divergence:V(s.divergenceMaterial),clear:V(s.clearMaterial),pressure:V(s.pressureMaterial),gradientSubtract:V(s.gradientSubtractMaterial)}),[s]),q=i.useCallback((H,G)=>{F(H),G&&Object.keys(G).forEach(se=>{O[se](G[se])})},[F,O]);return[i.useCallback((H,G,se)=>{const{gl:K,pointer:we,size:Le}=H;q(G,se);const Te=h(K,({read:N})=>{v(s.advectionMaterial),P.advection("uVelocity",N),P.advection("uSource",N),P.advection("dissipation",A.velocity_dissipation)}),mr=p(K,({read:N})=>{v(s.advectionMaterial),P.advection("uVelocity",Te),P.advection("uSource",N),P.advection("dissipation",A.density_dissipation)}),ye=A.pointerValues||y(we);ye.isVelocityUpdate&&(h(K,({read:N})=>{v(s.splatMaterial),P.splat("uTarget",N),P.splat("point",ye.currentPointer);const ve=ye.diffPointer.multiply(T.current.set(Le.width,Le.height).multiplyScalar(A.velocity_acceleration));P.splat("color",I.current.set(ve.x,ve.y,1)),P.splat("radius",A.splat_radius)}),p(K,({read:N})=>{v(s.splatMaterial),P.splat("uTarget",N);const ve=typeof A.fluid_color=="function"?A.fluid_color(ye.velocity):A.fluid_color;P.splat("color",ve)}));const pr=w(K,()=>{v(s.curlMaterial),P.curl("uVelocity",Te)});h(K,({read:N})=>{v(s.vorticityMaterial),P.vorticity("uVelocity",N),P.vorticity("uCurl",pr),P.vorticity("curl",A.curl_strength)});const fr=x(K,()=>{v(s.divergenceMaterial),P.divergence("uVelocity",Te)});_(K,({read:N})=>{v(s.clearMaterial),P.clear("uTexture",N),P.clear("value",A.pressure_dissipation)}),v(s.pressureMaterial),P.pressure("uDivergence",fr);let ke;for(let N=0;N{P.pressure("uPressure",ve)});return h(K,({read:N})=>{v(s.gradientSubtractMaterial),P.gradientSubtract("uPressure",ke),P.gradientSubtract("uVelocity",N)}),mr},[s,P,v,w,p,x,y,_,h,A,q]),q,{scene:l,mesh:g,materials:s,camera:d,renderTarget:{velocity:a,density:c,curl:f,divergence:b,pressure:S},output:c.read.texture}]};var Cn=`varying vec2 vUv; - -void main() { - vUv = uv; - gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); -}`,_n=`precision highp float; - -uniform sampler2D uMap; -uniform float uOpacity; - -varying vec2 vUv; - -void main() { - vec2 uv = vUv; - vec3 color = texture2D(uMap, uv).rgb; - gl_FragColor = vec4(color,uOpacity); -}`;const wn=({scale:e,max:n,texture:t,scene:r,uniforms:u,onBeforeCompile:m})=>{const l=i.useMemo(()=>new o.PlaneGeometry(e,e),[e]),s=i.useMemo(()=>new o.ShaderMaterial({uniforms:{uOpacity:{value:0},uMap:{value:t||D},...u},blending:o.AdditiveBlending,vertexShader:Cn,fragmentShader:_n,...z,transparent:!0}),[t,u]),v=i.useMemo(()=>{const g=[];for(let d=0;d()=>{v.forEach(g=>{g.geometry.dispose(),Array.isArray(g.material)?g.material.forEach(d=>d.dispose()):g.material.dispose(),r.remove(g)})},[r,v]),v},Re=Object.freeze({frequency:.01,rotation:.05,fadeout_speed:.9,scale:.3,alpha:.6,pointerValues:!1}),Tn=({texture:e,scale:n=64,max:t=100,size:r,dpr:u,samples:m,isSizeUpdate:l,uniforms:s,onBeforeCompile:v})=>{const g=U(u),d=i.useMemo(()=>new o.Scene,[]),y=wn({scale:n,max:t,texture:e,scene:d,uniforms:s,onBeforeCompile:v}),M=k(r),a=ge(),[h,c]=j({scene:d,camera:M,size:r,dpr:g.fbo,samples:m,isSizeUpdate:l}),[p,f]=$(Re),w=i.useRef(0),b=i.useMemo(()=>(S,_)=>{f(S),y.forEach(T=>{if(T.visible){const I=T.material;T.rotation.z+=p.rotation,T.scale.x=p.fadeout_speed*T.scale.x+p.scale,T.scale.y=T.scale.x;const A=I.uniforms.uOpacity.value;R(I)("uOpacity",A*p.fadeout_speed),A<.001&&(T.visible=!1)}V(T.material)(_)})},[y,p,f]);return[i.useCallback((S,_,T)=>{const{gl:I,pointer:A,size:F}=S;b(_,T);const P=p.pointerValues||a(A);if(p.frequency{const r=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),u=i.useMemo(()=>{const l=new o.ShaderMaterial({uniforms:{uTime:{value:0},scale:{value:ne.scale},timeStrength:{value:ne.timeStrength},noiseOctaves:{value:ne.noiseOctaves},fbmOctaves:{value:ne.fbmOctaves},warpOctaves:{value:ne.warpOctaves},warpDirection:{value:ne.warpDirection},warpStrength:{value:ne.warpStrength},...n},vertexShader:Dn,fragmentShader:Pn,...z});return l.onBeforeCompile=B(t),l},[t,n]),m=L(e,r,u,o.Mesh);return{material:u,mesh:m}},ne=Object.freeze({scale:.004,timeStrength:.3,noiseOctaves:2,fbmOctaves:2,warpOctaves:2,warpDirection:new o.Vector2(2,2),warpStrength:8,beat:!1}),An=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=Rn({scene:s,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[a,h]=$(ne),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{const{gl:_,clock:T}=b;return f(x,S),c("scale",a.scale),c("timeStrength",a.timeStrength),c("noiseOctaves",a.noiseOctaves),c("fbmOctaves",a.fbmOctaves),c("warpOctaves",a.warpOctaves),c("warpDirection",a.warpDirection),c("warpStrength",a.warpStrength),c("uTime",a.beat||T.getElapsedTime()),M(_)},[M,c,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var In="#usf ",Fn=`precision highp float; -varying vec2 vUv; - -uniform sampler2D uTexture; -uniform bool isTexture; -uniform sampler2D noise; -uniform bool isNoise; -uniform vec2 noiseStrength; -uniform float laminateLayer; -uniform vec2 laminateInterval; -uniform vec2 laminateDetail; -uniform vec2 distortion; -uniform vec3 colorFactor; -uniform float uTime; -uniform vec2 timeStrength; -uniform float scale; - -void main() { - vec2 uv = vUv; - - vec2 pos = isTexture ? texture2D(uTexture, uv).rg : uv * scale; - vec2 noise = isNoise ? texture2D(noise, uv).rg : vec2(0.0); - float alpha = isTexture ? texture2D(uTexture, uv).a : 1.0; - - - alpha = (alpha < 1e-10) ? 0.0 : alpha; - - vec3 col; - for(float j = 0.0; j < 3.0; j++){ - for(float i = 1.0; i < laminateLayer; i++){ - float timeNoiseSin = sin(uTime / (i + j)) * timeStrength.x + noise.r * noiseStrength.x; - float timeNoiseCos = cos(uTime / (i + j)) * timeStrength.y + noise.g * noiseStrength.y; - pos.x += laminateInterval.x / (i + j) * cos(i * distortion.x * pos.y + timeNoiseSin + sin(i + j)); - pos.y += laminateInterval.y / (i + j) * cos(i * distortion.y * pos.x + timeNoiseCos + sin(i + j)); - } - col[int(j)] = sin(pow(pos.x, 2.) * pow(laminateDetail.x, 2.)) + sin(pow(pos.y, 2.) * pow(laminateDetail.y, 2.)); - } - - col *= colorFactor * alpha; - col = clamp(col, 0.0, 1.0); - - gl_FragColor = vec4(col, alpha); -}`;const Vn=({scene:e,uniforms:n,onBeforeCompile:t})=>{const r=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),u=i.useMemo(()=>{const l=new o.ShaderMaterial({uniforms:{uTexture:{value:D},isTexture:{value:!1},scale:{value:Y.scale},noise:{value:D},noiseStrength:{value:Y.noiseStrength},isNoise:{value:!1},laminateLayer:{value:Y.laminateLayer},laminateInterval:{value:Y.laminateInterval},laminateDetail:{value:Y.laminateDetail},distortion:{value:Y.distortion},colorFactor:{value:Y.colorFactor},uTime:{value:0},timeStrength:{value:Y.timeStrength},...n},vertexShader:In,fragmentShader:Fn,...z});return l.onBeforeCompile=B(t),l},[t,n]),m=L(e,r,u,o.Mesh);return{material:u,mesh:m}},Y=Object.freeze({texture:!1,scale:1,laminateLayer:1,laminateInterval:new o.Vector2(.1,.1),laminateDetail:new o.Vector2(1,1),distortion:new o.Vector2(0,0),colorFactor:new o.Vector3(1,1,1),timeStrength:new o.Vector2(0,0),noise:!1,noiseStrength:new o.Vector2(0,0),beat:!1}),Bn=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=Vn({scene:s,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[a,h]=$(Y),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{const{gl:_,clock:T}=b;return f(x,S),a.texture?(c("uTexture",a.texture),c("isTexture",!0)):(c("isTexture",!1),c("scale",a.scale)),a.noise?(c("noise",a.noise),c("isNoise",!0),c("noiseStrength",a.noiseStrength)):c("isNoise",!1),c("uTime",a.beat||T.getElapsedTime()),c("laminateLayer",a.laminateLayer),c("laminateInterval",a.laminateInterval),c("laminateDetail",a.laminateDetail),c("distortion",a.distortion),c("colorFactor",a.colorFactor),c("timeStrength",a.timeStrength),M(_)},[M,c,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var zn="#usf ",On=`precision highp float; - -varying vec2 vUv; -uniform float u_time; -uniform float u_pattern; -uniform float u_complexity; -uniform float u_complexityAttenuation; -uniform float u_iterations; -uniform float u_timeStrength; -uniform float u_scale; - -vec3 marble(vec3 p){ - vec4 n; - for(float i;i{const r=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),u=i.useMemo(()=>{const l=new o.ShaderMaterial({uniforms:{u_time:{value:0},u_pattern:{value:oe.pattern},u_complexity:{value:oe.complexity},u_complexityAttenuation:{value:oe.complexityAttenuation},u_iterations:{value:oe.iterations},u_timeStrength:{value:oe.timeStrength},u_scale:{value:oe.scale},...n},vertexShader:zn,fragmentShader:On,...z});return l.onBeforeCompile=B(t),l},[t,n]),m=L(e,r,u,o.Mesh);return{material:u,mesh:m}},oe=Object.freeze({pattern:0,complexity:2,complexityAttenuation:.2,iterations:8,timeStrength:.2,scale:.002,beat:!1}),En=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=Un({scene:s,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[a,h]=$(oe),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{const{gl:_,clock:T}=b;return f(x,S),c("u_pattern",a.pattern),c("u_complexity",a.complexity),c("u_complexityAttenuation",a.complexityAttenuation),c("u_iterations",a.iterations),c("u_timeStrength",a.timeStrength),c("u_scale",a.scale),c("u_time",a.beat||T.getElapsedTime()),M(_)},[M,c,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var Ln="#usf ",kn=`precision highp float; -precision highp int; - -varying vec2 vUv; -uniform sampler2D uTexture; -uniform vec3 uColor1; -uniform vec3 uColor2; -uniform vec3 uColor3; -uniform vec3 uColor4; -uniform vec3 uRgbWeight; - -vec3 cosPalette( float t, vec3 color1, vec3 color2, vec3 color3, vec3 color4 ){ - return color1 + color2 * cos( 6.28318 * ( color3 * t + color4) ); -} - -void main() { - - vec4 tex = texture2D(uTexture, vUv); - float gray = dot(tex.rgb, uRgbWeight); - - vec3 outColor = cosPalette( - gray, - uColor1, - uColor2, - uColor3, - uColor4 - ); - - gl_FragColor = vec4(outColor, tex.a); -}`;const $n=({scene:e,uniforms:n,onBeforeCompile:t})=>{const r=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),u=i.useMemo(()=>{const l=new o.ShaderMaterial({uniforms:{uTexture:{value:D},uRgbWeight:{value:ie.rgbWeight},uColor1:{value:ie.color1},uColor2:{value:ie.color2},uColor3:{value:ie.color3},uColor4:{value:ie.color4},...n},vertexShader:Ln,fragmentShader:kn,...z});return l.onBeforeCompile=B(t),l},[t,n]),m=L(e,r,u,o.Mesh);return{material:u,mesh:m}},ie=Object.freeze({texture:D,color1:new o.Color().set(.5,.5,.5),color2:new o.Color().set(.5,.5,.5),color3:new o.Color().set(1,1,1),color4:new o.Color().set(0,.1,.2),rgbWeight:new o.Vector3(.299,.587,.114)}),jn=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=$n({scene:s,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[a,h]=$(ie),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{const{gl:_}=b;return f(x,S),c("uTexture",a.texture),c("uColor1",a.color1),c("uColor2",a.color2),c("uColor3",a.color3),c("uColor4",a.color4),c("uRgbWeight",a.rgbWeight),M(_)},[M,c,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var Wn="#usf ",qn=`precision highp float; - -varying vec2 vUv; -uniform sampler2D uTexture; - -uniform vec3 uColor0; -uniform vec3 uColor1; - -void main() { - vec2 uv = vUv; - vec4 texColor = texture2D(uTexture, uv); - 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 Nn=({scene:e,uniforms:n,onBeforeCompile:t})=>{const r=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),u=i.useMemo(()=>{const l=new o.ShaderMaterial({uniforms:{uTexture:{value:D},uColor0:{value:xe.color0},uColor1:{value:xe.color1},...n},vertexShader:Wn,fragmentShader:qn,...z});return l.onBeforeCompile=B(t),l},[t,n]),m=L(e,r,u,o.Mesh);return{material:u,mesh:m}},xe=Object.freeze({texture:D,color0:new o.Color(16777215),color1:new o.Color(0)}),Gn=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=Nn({scene:s,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[a,h]=$(xe),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{const{gl:_}=b;return f(x,S),c("uTexture",a.texture),c("uColor0",a.color0),c("uColor1",a.color1),M(_)},[M,c,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var Kn="#usf ",Xn=`precision highp float; - -varying vec2 vUv; -uniform sampler2D u_texture; -uniform sampler2D uMap; -uniform bool u_isAlphaMap; -uniform sampler2D u_alphaMap; -uniform float uMapIntensity; -uniform vec3 u_brightness; -uniform float u_min; -uniform float u_max; -uniform vec3 u_dodgeColor; -uniform bool u_isDodgeColor; - -void main() { - vec2 uv = vUv; - - #usf - - - float brightness = dot(mapColor,u_brightness); - vec4 textureMap = texture2D(u_texture, uv); - float blendValue = smoothstep(u_min, u_max, brightness); - - - vec3 dodgeColor = u_isDodgeColor ? u_dodgeColor : mapColor; - vec3 outputColor = blendValue * dodgeColor + (1.0 - blendValue) * textureMap.rgb; - - - float alpha = u_isAlphaMap ? texture2D(u_alphaMap, uv).a : textureMap.a; - float mixValue = u_isAlphaMap ? alpha : 0.0; - vec3 alphaColor = vec3(mix(outputColor,mapColor,mixValue)); - - gl_FragColor = vec4(alphaColor,alpha); -}`;const Hn=({scene:e,uniforms:n,onBeforeCompile:t})=>{const r=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),u=i.useMemo(()=>{const l=new o.ShaderMaterial({uniforms:{u_texture:{value:D},uMap:{value:D},u_alphaMap:{value:D},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 o.Color},u_isDodgeColor:{value:!1},...n},vertexShader:Kn,fragmentShader:Xn,...z});return l.onBeforeCompile=B(t),l},[t,n]),m=L(e,r,u,o.Mesh);return{material:u,mesh:m}},le=Object.freeze({texture:D,map:D,alphaMap:!1,mapIntensity:.3,brightness:new o.Vector3(.5,.5,.5),min:0,max:1,dodgeColor:!1}),Yn=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=Hn({scene:s,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[a,h]=$(le),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{const{gl:_}=b;return f(x,S),c("u_texture",a.texture),c("uMap",a.map),c("uMapIntensity",a.mapIntensity),a.alphaMap?(c("u_alphaMap",a.alphaMap),c("u_isAlphaMap",!0)):c("u_isAlphaMap",!1),c("u_brightness",a.brightness),c("u_min",a.min),c("u_max",a.max),a.dodgeColor?(c("u_dodgeColor",a.dodgeColor),c("u_isDodgeColor",!0)):c("u_isDodgeColor",!1),M(_)},[M,c,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var Qn="#usf ",Zn=`precision highp float; - -varying vec2 vUv; -uniform vec2 uResolution; -uniform vec2 uTextureResolution; -uniform sampler2D uTexture0; -uniform sampler2D uTexture1; -uniform sampler2D uMap; -uniform float mapIntensity; -uniform float edgeIntensity; -uniform float progress; -uniform float dirX; -uniform float dirY; -uniform vec2 epicenter; -uniform float padding; - -bool isInPaddingArea(vec2 uv) { - return uv.x < padding || uv.x > 1.0 - padding || uv.y < padding || uv.y > 1.0 - padding; -} - -void main() { - #usf - - - vec2 map = texture2D(uMap, uv).rg; - vec2 normalizedMap = map * 2.0 - 1.0; - - - uv = uv * 2.0 - 1.0; - uv *= map * distance(epicenter, uv) * edgeIntensity + 1.0; - uv = (uv + 1.0) / 2.0; - - - if (isInPaddingArea(uv)) { - gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0); - return; - } - vec2 paddedUV = uv * (1.0 - 2.0 * padding * -1.) + padding * -1.; - - - vec2 centeredUV = paddedUV - vec2(0.5); - - - centeredUV *= normalizedMap * map * mapIntensity + 1.0; - - - float xOffsetTexture0 = 0.5 - dirX * progress; - float yOffsetTexture0 = 0.5 - dirY * progress; - vec2 samplePosTexture0 = vec2(xOffsetTexture0, yOffsetTexture0) + centeredUV; - - - float xOffsetTexture1 = 0.5 + dirX * (1.0 - progress); - float yOffsetTexture1 = 0.5 + dirY * (1.0 - progress); - vec2 samplePosTexture1 = vec2(xOffsetTexture1, yOffsetTexture1) + centeredUV; - - vec4 color0 = texture2D(uTexture0, samplePosTexture0); - vec4 color1 = texture2D(uTexture1, samplePosTexture1); - - gl_FragColor = mix(color0, color1, progress); - -}`;const Jn=({scene:e,size:n,dpr:t,uniforms:r,onBeforeCompile:u})=>{const m=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),l=i.useMemo(()=>{var d,y;const g=new o.ShaderMaterial({uniforms:{uResolution:{value:new o.Vector2},uTextureResolution:{value:new o.Vector2},uTexture0:{value:D},uTexture1:{value:D},padding:{value:te.padding},uMap:{value:D},edgeIntensity:{value:te.edgeIntensity},mapIntensity:{value:te.mapIntensity},epicenter:{value:te.epicenter},progress:{value:te.progress},dirX:{value:(d=te.dir)==null?void 0:d.x},dirY:{value:(y=te.dir)==null?void 0:y.y},...r},vertexShader:Qn,fragmentShader:Zn,...z});return g.onBeforeCompile=B(u),g},[u,r]),s=X(n,t);R(l)("uResolution",s.clone());const v=L(e,m,l,o.Mesh);return{material:l,mesh:v}},te=Object.freeze({texture0:D,texture1:D,padding:0,map:D,mapIntensity:0,edgeIntensity:0,epicenter:new o.Vector2(0,0),progress:0,dir:new o.Vector2(0,0)}),et=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=Jn({scene:s,size:e,dpr:l.shader,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,dpr:l.fbo,size:e,samples:t,isSizeUpdate:r}),[a,h]=$(te),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{var F,P,O,q,ae,H,G,se;const{gl:_}=b;f(x,S),c("uTexture0",a.texture0),c("uTexture1",a.texture1),c("progress",a.progress);const T=[((P=(F=a.texture0)==null?void 0:F.image)==null?void 0:P.width)||0,((q=(O=a.texture0)==null?void 0:O.image)==null?void 0:q.height)||0],I=[((H=(ae=a.texture1)==null?void 0:ae.image)==null?void 0:H.width)||0,((se=(G=a.texture1)==null?void 0:G.image)==null?void 0:se.height)||0],A=T.map((K,we)=>K+(I[we]-K)*a.progress);return c("uTextureResolution",A),c("padding",a.padding),c("uMap",a.map),c("mapIntensity",a.mapIntensity),c("edgeIntensity",a.edgeIntensity),c("epicenter",a.epicenter),c("dirX",a.dir.x),c("dirY",a.dir.y),M(_)},[M,c,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var nt="#usf ",tt=`precision highp float; - -varying vec2 vUv; -uniform sampler2D u_texture; -uniform vec3 u_brightness; -uniform float u_min; -uniform float u_max; - -void main() { - vec2 uv = vUv; - vec3 color = texture2D(u_texture, uv).rgb; - 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 rt=({scene:e,uniforms:n,onBeforeCompile:t})=>{const r=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),u=i.useMemo(()=>{const l=new o.ShaderMaterial({uniforms:{u_texture:{value:D},u_brightness:{value:pe.brightness},u_min:{value:pe.min},u_max:{value:pe.max},...n},vertexShader:nt,fragmentShader:tt,...z});return l.onBeforeCompile=B(t),l},[t,n]),m=L(e,r,u,o.Mesh);return{material:u,mesh:m}},pe=Object.freeze({texture:D,brightness:new o.Vector3(.5,.5,.5),min:0,max:1}),ot=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=rt({scene:s,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[a,h]=$(pe),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{const{gl:_}=b;return f(x,S),c("u_texture",a.texture),c("u_brightness",a.brightness),c("u_min",a.min),c("u_max",a.max),M(_)},[M,c,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var at="#usf ",ut=`precision highp float; - -varying vec2 vUv; -uniform sampler2D u_texture; -uniform sampler2D uMap; -uniform float uMapIntensity; - -void main() { - vec2 uv = vUv; - - #usf - - gl_FragColor = texture2D(u_texture, uv); -}`;const it=({scene:e,uniforms:n,onBeforeCompile:t})=>{const r=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),u=i.useMemo(()=>{const l=new o.ShaderMaterial({uniforms:{u_texture:{value:D},uMap:{value:D},uMapIntensity:{value:Ce.mapIntensity},...n},vertexShader:at,fragmentShader:ut,...z});return l.onBeforeCompile=B(t),l},[t,n]),m=L(e,r,u,o.Mesh);return{material:u,mesh:m}},Ce=Object.freeze({texture:D,map:D,mapIntensity:.3}),st=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=it({scene:s,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[a,h]=$(Ce),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{const{gl:_}=b;return f(x,S),c("u_texture",a.texture),c("uMap",a.map),c("uMapIntensity",a.mapIntensity),M(_)},[M,c,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var lt="#usf ",ct=`precision highp float; - -uniform sampler2D uTexture; -uniform sampler2D uMap; - -varying vec2 vUv; - -void main() { - vec2 uv = vUv; - vec4 tex = texture2D(uTexture, uv); - vec4 map = texture2D(uMap, uv); - gl_FragColor = mix(tex,map,map.a); -}`;const vt=({scene:e,uniforms:n,onBeforeCompile:t})=>{const r=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),u=i.useMemo(()=>{const l=new o.ShaderMaterial({uniforms:{uTexture:{value:D},uMap:{value:D},...n},vertexShader:lt,fragmentShader:ct,...z});return l.onBeforeCompile=B(t),l},[t,n]),m=L(e,r,u,o.Mesh);return{material:u,mesh:m}},Ae=Object.freeze({texture:D,map:D}),mt=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=vt({scene:s,size:e,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[a,h]=$(Ae),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{const{gl:_}=b;return f(x,S),c("uTexture",a.texture),c("uMap",a.map),M(_)},[c,M,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var pt="#usf ",ft=`precision highp float; - -varying vec2 vUv; -uniform sampler2D u_texture; -uniform float u_brightness; -uniform float u_saturation; - -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)); - vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); - - 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); -} - -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); -} - -void main() { - vec4 tex = texture2D(u_texture, vUv); - vec3 hsv = rgb2hsv(tex.rgb); - hsv.y *= u_saturation; - hsv.z *= u_brightness; - vec3 final = hsv2rgb(hsv); - gl_FragColor = vec4(final, tex.a); -}`;const dt=({scene:e,uniforms:n,onBeforeCompile:t})=>{const r=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),u=i.useMemo(()=>{const l=new o.ShaderMaterial({uniforms:{u_texture:{value:D},u_brightness:{value:Me.brightness},u_saturation:{value:Me.saturation},...n},vertexShader:pt,fragmentShader:ft,...z});return l.onBeforeCompile=B(t),l},[t,n]),m=L(e,r,u,o.Mesh);return{material:u,mesh:m}},Me=Object.freeze({texture:D,brightness:1,saturation:1}),gt=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=dt({scene:s,size:e,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[a,h]=$(Me),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{const{gl:_}=b;return f(x,S),c("u_texture",a.texture),c("u_brightness",a.brightness),c("u_saturation",a.saturation),M(_)},[c,M,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var ht="#usf ",xt=`precision highp float; - -varying vec2 vUv; -uniform vec2 uResolution; -uniform vec2 uTextureResolution; -uniform sampler2D uTexture; - -void main() { - #usf - - gl_FragColor = texture2D(uTexture, uv); -}`;const Mt=({scene:e,size:n,dpr:t,uniforms:r,onBeforeCompile:u})=>{const m=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),l=i.useMemo(()=>{const g=new o.ShaderMaterial({uniforms:{uResolution:{value:new o.Vector2},uTextureResolution:{value:new o.Vector2},uTexture:{value:D},...r},vertexShader:ht,fragmentShader:xt,...z});return g.onBeforeCompile=B(u),g},[u,r]),s=X(n,t);R(l)("uResolution",s.clone());const v=L(e,m,l,o.Mesh);return{material:l,mesh:v}},Ie=Object.freeze({texture:D}),yt=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=Mt({scene:s,size:e,dpr:l.shader,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,dpr:l.fbo,size:e,samples:t,isSizeUpdate:r}),[a,h]=$(Ie),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{var T,I,A,F,P,O;const{gl:_}=b;return f(x,S),c("uTexture",a.texture),c("uTextureResolution",[((A=(I=(T=a.texture)==null?void 0:T.source)==null?void 0:I.data)==null?void 0:A.width)||0,((O=(P=(F=a.texture)==null?void 0:F.source)==null?void 0:P.data)==null?void 0:O.height)||0]),M(_)},[M,c,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var bt="#usf ",St=`precision highp float; - -varying vec2 vUv; -uniform sampler2D uTexture; -uniform vec2 uResolution; -uniform float uBlurSize; - -void main() { - vec2 uv = vUv; - vec2 perDivSize = uBlurSize / uResolution; - - - vec4 outColor = vec4( - texture2D(uTexture, uv + perDivSize * vec2(-1.0, -1.0)) + - texture2D(uTexture, uv + perDivSize * vec2(0.0, -1.0)) + - texture2D(uTexture, uv + perDivSize * vec2(1.0, -1.0)) + - texture2D(uTexture, uv + perDivSize * vec2(-1.0, 0.0)) + - texture2D(uTexture, uv + perDivSize * vec2(0.0, 0.0)) + - texture2D(uTexture, uv + perDivSize * vec2(1.0, 0.0)) + - texture2D(uTexture, uv + perDivSize * vec2(-1.0, 1.0)) + - texture2D(uTexture, uv + perDivSize * vec2(0.0, 1.0)) + - texture2D(uTexture, uv + perDivSize * vec2(1.0, 1.0)) - ) / 9.0; - - gl_FragColor = outColor; -}`;const Ct=({scene:e,uniforms:n,onBeforeCompile:t})=>{const r=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),u=i.useMemo(()=>{const l=new o.ShaderMaterial({uniforms:{uTexture:{value:D},uResolution:{value:new o.Vector2(0,0)},uBlurSize:{value:_e.blurSize},...n},vertexShader:bt,fragmentShader:St,...z});return l.onBeforeCompile=B(t),l},[t,n]),m=L(e,r,u,o.Mesh);return{material:u,mesh:m}},_e=Object.freeze({texture:D,blurSize:3,blurPower:5}),_t=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=Ct({scene:s,uniforms:u,onBeforeCompile:m}),d=k(e),y=i.useMemo(()=>({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[s,d,e,l.fbo,t,r]),[M,a]=re(y),[h,c]=$(_e),p=R(v),f=V(v),w=i.useCallback((x,S)=>{c(x),f(S)},[c,f]);return[i.useCallback((x,S,_)=>{var F,P,O,q,ae,H;const{gl:T}=x;w(S,_),p("uTexture",h.texture),p("uResolution",[((O=(P=(F=h.texture)==null?void 0:F.source)==null?void 0:P.data)==null?void 0:O.width)||0,((H=(ae=(q=h.texture)==null?void 0:q.source)==null?void 0:ae.data)==null?void 0:H.height)||0]),p("uBlurSize",h.blurSize);let I=a(T);const A=h.blurPower;for(let G=0;G{const r=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),u=i.useMemo(()=>{const l=new o.ShaderMaterial({uniforms:{uTexture:{value:D},uBackbuffer:{value:D},uBegin:{value:fe.begin},uEnd:{value:fe.end},uStrength:{value:fe.strength},...n},vertexShader:wt,fragmentShader:Tt,...z});return l.onBeforeCompile=B(t),l},[t,n]),m=L(e,r,u,o.Mesh);return{material:u,mesh:m}},fe=Object.freeze({texture:D,begin:new o.Vector2(0,0),end:new o.Vector2(0,0),strength:.9}),Pt=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=Dt({scene:s,uniforms:u,onBeforeCompile:m}),d=k(e),y=i.useMemo(()=>({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[s,d,e,l.fbo,t,r]),[M,a]=re(y),[h,c]=$(fe),p=R(v),f=V(v),w=i.useCallback((x,S)=>{c(x),f(S)},[c,f]);return[i.useCallback((x,S,_)=>{const{gl:T}=x;return w(S,_),p("uTexture",h.texture),p("uBegin",h.begin),p("uEnd",h.end),p("uStrength",h.strength),a(T,({read:I})=>{p("uBackbuffer",I)})},[a,p,w,h]),w,{scene:s,mesh:g,material:v,camera:d,renderTarget:M,output:M.read.texture}]};var Rt="#usf ",At=`precision highp float; - -varying vec2 vUv; -uniform float uProgress; -uniform float uStrength; -uniform float uWidth; -uniform vec2 uEpicenter; -uniform int uMode; - -float PI = 3.141592653589; - -void main() { - - vec2 uv = vUv; - - float progress = min(uProgress, 1.0); - float progressFactor = sin(progress * PI); - - float border = progress - progress * progressFactor * uWidth; - float blur = uStrength * progressFactor; - - - vec2 normalizeCenter = (uEpicenter + 1.0) / 2.0; - - - float dist = uMode == 0 ? length(uv - normalizeCenter) : uMode == 1 ? length(uv.x - normalizeCenter.x) : length(uv.y - normalizeCenter.y); - - - float maxDistance = max( - length(vec2(0.0, 0.0) - normalizeCenter), - max( - length(vec2(1.0, 0.0) - normalizeCenter), - max( - length(vec2(0.0, 1.0) - normalizeCenter), - length(vec2(1.0, 1.0) - normalizeCenter) - ) - ) - ); - - - dist = maxDistance > 0.0 ? dist / maxDistance : dist; - - vec3 color = vec3(smoothstep(border - blur, border, dist) - - smoothstep(progress, progress + blur, dist)); - - - color *= progressFactor; - - gl_FragColor = vec4(color, 1.0); -}`;const It=({scene:e,uniforms:n,onBeforeCompile:t})=>{const r=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),u=i.useMemo(()=>{const l=new o.ShaderMaterial({uniforms:{uEpicenter:{value:ce.epicenter},uProgress:{value:ce.progress},uStrength:{value:ce.strength},uWidth:{value:ce.width},uMode:{value:0},...n},vertexShader:Rt,fragmentShader:At,...z});return l.onBeforeCompile=B(t),l},[t,n]),m=L(e,r,u,o.Mesh);return{material:u,mesh:m}},ce=Object.freeze({epicenter:new o.Vector2(0,0),progress:0,width:0,strength:0,mode:"center"}),Ft=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=It({scene:s,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[a,h]=$(ce),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{const{gl:_}=b;return f(x,S),c("uEpicenter",a.epicenter),c("uProgress",a.progress),c("uWidth",a.width),c("uStrength",a.strength),c("uMode",a.mode==="center"?0:a.mode==="horizontal"?1:2),M(_)},[M,c,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var Vt="#usf ",Bt=`precision highp float; -varying vec2 vUv; - -uniform sampler2D u_texture; -uniform vec2 u_resolution; -uniform vec3 u_keyColor; -uniform float u_similarity; -uniform float u_smoothness; -uniform float u_spill; - -uniform vec4 u_color; -uniform float u_contrast; -uniform float u_brightness; -uniform float u_gamma; - -vec2 RGBtoUV(vec3 rgb) { - return vec2( - rgb.r * -0.169 + rgb.g * -0.331 + rgb.b * 0.5 + 0.5, - rgb.r * 0.5 + rgb.g * -0.419 + rgb.b * -0.081 + 0.5 - ); -} -float getChromeDist(vec3 texColor){ - float chromaDist = distance(RGBtoUV(texColor), RGBtoUV(u_keyColor)); - return chromaDist; -} - -float getBoxFilteredChromaDist(vec3 rgb, vec2 uv) -{ - vec2 pixel_size = vec2(1.) / u_resolution; - vec2 h_pixel_size = pixel_size / 2.0; - vec2 point_0 = vec2(pixel_size.x, h_pixel_size.y); - vec2 point_1 = vec2(h_pixel_size.x, -pixel_size.y); - float distVal = getChromeDist(texture2D(u_texture,uv-point_0).rgb); - distVal += getChromeDist(texture2D(u_texture,uv+point_0).rgb); - distVal += getChromeDist(texture2D(u_texture,uv-point_1).rgb); - distVal += getChromeDist(texture2D(u_texture,uv+point_1).rgb); - distVal *= 2.0; - distVal += getChromeDist(rgb); - return distVal / 9.0; -} - -vec4 CalcColor(vec4 rgba) -{ - return vec4(pow(rgba.rgb, vec3(u_gamma, u_gamma, u_gamma)) * u_contrast + u_brightness, rgba.a); -} - -void main() { - - vec2 uv = vUv; - - vec4 texColor = texture2D(u_texture, uv); - texColor.rgb *= (texColor.a > 0.) ? (1. / texColor.a) : 0.; - - float chromaDist = getBoxFilteredChromaDist(texColor.rgb,uv); - - float baseMask = chromaDist - u_similarity; - float fullMask = pow(clamp(baseMask / u_smoothness, 0., 1.), 1.5); - - texColor.rgba *= u_color; - texColor.a = fullMask; - - float spillVal = pow(clamp(baseMask / u_spill, 0., 1.), 1.5); - float desat = clamp(texColor.r * 0.2126 + texColor.g * 0.7152 + texColor.b * 0.0722, 0., 1.); - texColor.rgb = mix(vec3(desat, desat, desat), texColor.rgb, spillVal); - - vec4 finColor = CalcColor(texColor); - - gl_FragColor = finColor; -}`;const zt=({scene:e,size:n,dpr:t,uniforms:r,onBeforeCompile:u})=>{const m=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),l=i.useMemo(()=>{const g=new o.ShaderMaterial({uniforms:{u_texture:{value:D},u_resolution:{value:new o.Vector2},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},...r},vertexShader:Vt,fragmentShader:Bt,...z});return g.onBeforeCompile=B(u),g},[u,r]),s=X(n,t);R(l)("u_resolution",s.clone());const v=L(e,m,l,o.Mesh);return{material:l,mesh:v}},Q=Object.freeze({texture:D,keyColor:new o.Color(65280),similarity:.2,smoothness:.1,spill:.2,color:new o.Vector4(1,1,1,1),contrast:1,brightness:0,gamma:1}),Ot=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=zt({scene:s,size:e,dpr:l.shader,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[a,h]=$(Q),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{const{gl:_}=b;return f(x,S),c("u_texture",a.texture),c("u_keyColor",a.keyColor),c("u_similarity",a.similarity),c("u_smoothness",a.smoothness),c("u_spill",a.spill),c("u_color",a.color),c("u_contrast",a.contrast),c("u_brightness",a.brightness),c("u_gamma",a.gamma),M(_)},[M,c,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var Ut=`precision highp float; - -varying vec2 vUv; -#usf - -#usf - -void main() { - vec4 usf_Position = vec4(position,1.); - vUv = uv; - - #usf
- - gl_Position = usf_Position; -}`,Et=`precision highp float; - -varying vec2 vUv; -#usf - -uniform sampler2D uTexture; -uniform sampler2D uBackbuffer; -uniform float uTime; -uniform vec2 uPointer; -uniform vec2 uResolution; - -#usf - -void main() { - vec4 usf_FragColor = vec4(1.); - - #usf
- - gl_FragColor = usf_FragColor; -}`;const Lt=({scene:e,size:n,dpr:t,uniforms:r,onBeforeCompile:u})=>{const m=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),l=i.useMemo(()=>{const g=new o.ShaderMaterial({uniforms:{uTexture:{value:D},uBackbuffer:{value:D},uTime:{value:0},uPointer:{value:new o.Vector2},uResolution:{value:new o.Vector2},...r},vertexShader:Ut,fragmentShader:Et,...z});return g.onBeforeCompile=B(u),g},[u,r]),s=X(n,t);R(l)("uResolution",s.clone());const v=L(e,m,l,o.Mesh);return{material:l,mesh:v}},Fe=Object.freeze({texture:D,beat:!1}),kt=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=Lt({scene:s,size:e,dpr:l.shader,uniforms:u,onBeforeCompile:m}),d=k(e),y=i.useMemo(()=>({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[s,d,e,l.fbo,t,r]),[M,a]=re(y),[h,c]=$(Fe),p=R(v),f=V(v),w=i.useCallback((x,S)=>{c(x),f(S)},[c,f]);return[i.useCallback((x,S,_)=>{const{gl:T,clock:I,pointer:A}=x;return w(S,_),p("uPointer",A),p("uTexture",h.texture),p("uTime",h.beat||I.getElapsedTime()),a(T,({read:F})=>{p("uBackbuffer",F)})},[a,p,h,w]),w,{scene:s,mesh:g,material:v,camera:d,renderTarget:M,output:M.read.texture}]},$t=({scene:e,geometry:n,material:t})=>{const r=L(e,n,t,o.Points),u=L(e,i.useMemo(()=>n.clone(),[n]),i.useMemo(()=>t.clone(),[t]),o.Mesh);return u.visible=!1,{points:r,interactiveMesh:u}};var jt=`uniform vec2 uResolution; -uniform float uMorphProgress; -uniform float uPointSize; - -uniform sampler2D uPicture; -uniform bool uIsPicture; -uniform sampler2D uAlphaPicture; -uniform bool uIsAlphaPicture; - -uniform vec3 uColor0; -uniform vec3 uColor1; -uniform vec3 uColor2; -uniform vec3 uColor3; - -uniform float uTime; - -uniform float uWobblePositionFrequency; -uniform float uWobbleTimeFrequency; -uniform float uWobbleStrength; -uniform float uWarpPositionFrequency; -uniform float uWarpTimeFrequency; -uniform float uWarpStrength; - -uniform sampler2D uDisplacement; -uniform bool uIsDisplacement; -uniform float uDisplacementIntensity; - -uniform float uSizeRandomIntensity; -uniform float uSizeRandomTimeFrequency; -uniform float uSizeRandomMin; -uniform float uSizeRandomMax; - -uniform float uMapArrayLength; - -uniform float uDivergence; -uniform vec3 uDivergencePoint; - -varying vec3 vColor; -varying float vPictureAlpha; -varying vec3 vDisplacementColor; -varying float vDisplacementIntensity; -varying float vMapArrayIndex; - -#usf - -#usf - -#usf - -float random3D(vec3 co) { - return fract(sin(dot(co.xyz ,vec3(12.9898, 78.233, 45.764))) * 43758.5453); -} - -void main() { - vec3 newPosition = position; - vec2 newUv = uv; - - #usf - #usf - - - vec3 displacement = uIsDisplacement ? texture2D(uDisplacement, newUv).rgb : vec3(0.0); - float displacementIntensity = smoothstep(0., 1., displacement.g); - vDisplacementColor = displacement; - vDisplacementIntensity = displacementIntensity; - - - displacement = displacement * 2.-1.; - displacement *= displacementIntensity * uDisplacementIntensity; - newPosition += displacement; - - - vec3 divergenceDir = newPosition - uDivergencePoint; - if (uDivergence > 0.0) { - newPosition += normalize(divergenceDir) * uDivergence; - } else if (uDivergence < 0.0) { - newPosition -= normalize(divergenceDir) * abs(uDivergence); - } - - - vec4 modelPosition = modelMatrix * vec4(newPosition, 1.0); - vec4 viewPosition = viewMatrix * modelPosition; - vec4 projectedPosition = projectionMatrix * viewPosition; - - - float wobble = uWobbleStrength > 0. ? getWobble(projectedPosition.xyz) : 0.0; - - gl_Position = projectedPosition += wobble; - - - vColor = uIsPicture ? texture2D(uPicture, newUv).rgb : mix(mix(uColor0, uColor1, newPosition.x), mix(uColor2, uColor3, newPosition.y), newPosition.z); - - - vPictureAlpha = uIsAlphaPicture ? texture2D(uAlphaPicture, newUv).g : 1.; - - - - float sizeRand = uSizeRandomIntensity > 0. ? mix(uSizeRandomMin,uSizeRandomMax,(simplexNoise4d(vec4(newPosition,uTime * uSizeRandomTimeFrequency))*.5+.5)) * uSizeRandomIntensity : 1.; - gl_PointSize = uPointSize * vPictureAlpha * uResolution.y * sizeRand; - gl_PointSize *= (1.0 / - viewPosition.z); - - - vMapArrayIndex = uMapArrayLength > 0. ? floor(random3D(position) * uMapArrayLength) : 0.; -}`,Wt=`precision highp float; -precision highp int; - -varying vec3 vColor; -varying float vPictureAlpha; -varying vec3 vDisplacementColor; -varying float vDisplacementIntensity; -varying float vMapArrayIndex; - -uniform float uBlurAlpha; -uniform float uBlurRadius; -uniform sampler2D uMap; -uniform bool uIsMap; -uniform sampler2D uAlphaMap; -uniform bool uIsAlphaMap; -uniform float uDisplacementColorIntensity; -uniform float uPointAlpha; - -#usf - -void main() { - vec2 uv = gl_PointCoord; - uv.y = 1.0 - uv.y; - - - float distanceToCenter = length(uv - .5); - float alpha = clamp(uBlurRadius / distanceToCenter - (1.-uBlurAlpha) , 0. , 1.); - - - vec4 mapArrayColor; - #usf - vec4 mapColor = isMapArray ? mapArrayColor : uIsMap ? texture2D(uMap,uv) : vec4(1.); - vec3 finalColor = isMapArray || uIsMap ? mapColor.rgb : vColor; - - - float mixIntensity = clamp(uDisplacementColorIntensity * vDisplacementIntensity,0.,1.); - finalColor = vDisplacementIntensity > 0. ? mix(finalColor,vDisplacementColor,mixIntensity) : finalColor; - - - float alphaMap = uIsAlphaMap ? texture2D(uAlphaMap,uv).g : 1.; - - gl_FragColor = vec4(finalColor,alpha * vPictureAlpha * alphaMap * mapColor.a * uPointAlpha); -}`;const Ve=(e,n,t,r,u)=>{var d;const m=t==="position"?"positionTarget":"uvTarget",l=t==="position"?"#usf ":"#usf ",s=t==="position"?"#usf ":"#usf ",v=t==="position"?"positionsList":"uvsList",g=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 o.BufferAttribute(e[0],u));let y="",M="";e.forEach((a,h)=>{n.setAttribute(`${m}${h}`,new o.BufferAttribute(a,u)),y+=`attribute vec${u} ${m}${h}; -`,h===0?M+=`${m}${h}`:M+=`,${m}${h}`}),r=r.replace(`${l}`,y),r=r.replace(`${s}`,`vec${u} ${v}[${e.length}] = vec${u}[](${M}); - ${g} - `)}else r=r.replace(`${l}`,""),r=r.replace(`${s}`,""),(d=n==null?void 0:n.attributes[t])!=null&&d.array||De&&console.error(`use-shader-fx:geometry.attributes.${t}.array is not found`);return r},Be=(e,n,t,r)=>{var m;let u=[];if(e&&e.length>0){(m=n==null?void 0:n.attributes[t])!=null&&m.array?u=[n.attributes[t].array,...e]:u=e;const l=Math.max(...u.map(s=>s.length));u.forEach((s,v)=>{if(s.length{let t="";const r={};let u="mapArrayColor = ";return e&&e.length>0?(e.forEach((l,s)=>{const v=`vMapArrayIndex < ${s}.1`,g=`texture2D(uMapArray${s}, uv)`;u+=`( ${v} ) ? ${g} : `,t+=` - uniform sampler2D uMapArray${s}; - `,r[`uMapArray${s}`]={value:l}}),u+="vec4(1.);",t+="bool isMapArray = true;",r.uMapArrayLength={value:e.length}):(u+="vec4(1.0);",t+="bool isMapArray = false;",r.uMapArrayLength={value:0}),{rewritedFragmentShader:n.replace("#usf ",u).replace("#usf ",t),mapArrayUniforms:r}},Nt=({size:e,dpr:n,geometry:t,positions:r,uvs:u,mapArray:m,uniforms:l,onBeforeCompile:s})=>{const v=i.useMemo(()=>Be(r,t,"position",3),[r,t]),g=i.useMemo(()=>Be(u,t,"uv",2),[u,t]),d=i.useMemo(()=>{v.length!==g.length&&De&&console.log("use-shader-fx:positions and uvs are not matched");const M=Ve(g,t,"uv",Ve(v,t,"position",jt,3),2),{rewritedFragmentShader:a,mapArrayUniforms:h}=qt(m,Wt),c=new o.ShaderMaterial({vertexShader:M,fragmentShader:a,blending:o.AdditiveBlending,...z,transparent:!0,uniforms:{uResolution:{value:new o.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:D},uIsPicture:{value:!1},uAlphaPicture:{value:D},uIsAlphaPicture:{value:!1},uColor0:{value:E.color0},uColor1:{value:E.color1},uColor2:{value:E.color2},uColor3:{value:E.color3},uMap:{value:D},uIsMap:{value:!1},uAlphaMap:{value:D},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:D},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},...h,...l}});return c.onBeforeCompile=B(s),c},[t,v,g,m,s,l]),y=X(e,n);return R(d)("uResolution",y.clone()),{material:d,modifiedPositions:v,modifiedUvs:g}},ze=({size:e,dpr:n,scene:t=!1,geometry:r,positions:u,uvs:m,mapArray:l,uniforms:s,onBeforeCompile:v})=>{const g=U(n),d=i.useMemo(()=>{const b=r||new o.SphereGeometry(1,32,32);return b.setIndex(null),b.deleteAttribute("normal"),b},[r]),{material:y,modifiedPositions:M,modifiedUvs:a}=Nt({size:e,dpr:g.shader,geometry:d,positions:u,uvs:m,mapArray:l,uniforms:s,onBeforeCompile:v}),{points:h,interactiveMesh:c}=$t({scene:t,geometry:d,material:y}),p=R(y),f=V(y);return[i.useCallback((b,x,S)=>{b&&p("uTime",(x==null?void 0:x.beat)||b.clock.getElapsedTime()),x!==void 0&&(p("uMorphProgress",x.morphProgress),p("uBlurAlpha",x.blurAlpha),p("uBlurRadius",x.blurRadius),p("uPointSize",x.pointSize),p("uPointAlpha",x.pointAlpha),x.picture?(p("uPicture",x.picture),p("uIsPicture",!0)):x.picture===!1&&p("uIsPicture",!1),x.alphaPicture?(p("uAlphaPicture",x.alphaPicture),p("uIsAlphaPicture",!0)):x.alphaPicture===!1&&p("uIsAlphaPicture",!1),p("uColor0",x.color0),p("uColor1",x.color1),p("uColor2",x.color2),p("uColor3",x.color3),x.map?(p("uMap",x.map),p("uIsMap",!0)):x.map===!1&&p("uIsMap",!1),x.alphaMap?(p("uAlphaMap",x.alphaMap),p("uIsAlphaMap",!0)):x.alphaMap===!1&&p("uIsAlphaMap",!1),p("uWobbleStrength",x.wobbleStrength),p("uWobblePositionFrequency",x.wobblePositionFrequency),p("uWobbleTimeFrequency",x.wobbleTimeFrequency),p("uWarpStrength",x.warpStrength),p("uWarpPositionFrequency",x.warpPositionFrequency),p("uWarpTimeFrequency",x.warpTimeFrequency),x.displacement?(p("uDisplacement",x.displacement),p("uIsDisplacement",!0)):x.displacement===!1&&p("uIsDisplacement",!1),p("uDisplacementIntensity",x.displacementIntensity),p("uDisplacementColorIntensity",x.displacementColorIntensity),p("uSizeRandomIntensity",x.sizeRandomIntensity),p("uSizeRandomTimeFrequency",x.sizeRandomTimeFrequency),p("uSizeRandomMin",x.sizeRandomMin),p("uSizeRandomMax",x.sizeRandomMax),p("uDivergence",x.divergence),p("uDivergencePoint",x.divergencePoint),f(S))},[p,f]),{points:h,interactiveMesh:c,positions:M,uvs:a}]},E=Object.freeze({morphProgress:0,blurAlpha:.9,blurRadius:.05,pointSize:.05,pointAlpha:1,picture:!1,alphaPicture:!1,color0:new o.Color(16711680),color1:new o.Color(65280),color2:new o.Color(255),color3:new o.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 o.Vector3(0),beat:!1}),Gt=({size:e,dpr:n,samples:t,isSizeUpdate:r,camera:u,geometry:m,positions:l,uvs:s,uniforms:v,onBeforeCompile:g})=>{const d=U(n),y=i.useMemo(()=>new o.Scene,[]),[M,{points:a,interactiveMesh:h,positions:c,uvs:p}]=ze({scene:y,size:e,dpr:n,geometry:m,positions:l,uvs:s,uniforms:v,onBeforeCompile:g}),[f,w]=j({scene:y,camera:u,size:e,dpr:d.fbo,samples:t,isSizeUpdate:r,depthBuffer:!0}),b=i.useCallback((S,_,T)=>(M(S,_,T),w(S.gl)),[w,M]),x=i.useCallback((S,_)=>{M(null,S,_)},[M]);return[b,x,{scene:y,points:a,interactiveMesh:h,renderTarget:f,output:f.texture,positions:c,uvs:p}]};function Kt(e,n=1e-4){n=Math.max(n,Number.EPSILON);const t={},r=e.getIndex(),u=e.getAttribute("position"),m=r?r.count:u.count;let l=0;const s=Object.keys(e.attributes),v={},g={},d=[],y=["getX","getY","getZ","getW"];for(let c=0,p=s.length;c[]))}const M=Math.log10(1/n),a=Math.pow(10,M);for(let c=0;c 0.0) { - distortionNormal = uDistortion * vec3(snoiseFractal(vec3((pos * uDistortionScale + temporalOffset))), snoiseFractal(vec3(pos.zxy * uDistortionScale - temporalOffset)), snoiseFractal(vec3(pos.yxz * uDistortionScale + temporalOffset))); -} - -for (float i = 0.0; i < uRefractionSamples; i ++) { - vec3 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); - - transmissionR = getIBLVolumeRefraction( - sampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90, - pos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness + thickness_smear * (i + randomCoords) / uRefractionSamples, - material.attenuationColor, material.attenuationDistance - ).r; - transmissionG = getIBLVolumeRefraction( - sampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90, - pos, modelMatrix, viewMatrix, projectionMatrix, material.ior * (1.0 + uChromaticAberration * (i + randomCoords) / uRefractionSamples) , material.thickness + thickness_smear * (i + randomCoords) / uRefractionSamples, - material.attenuationColor, material.attenuationDistance - ).g; - transmissionB = getIBLVolumeRefraction( - sampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90, - pos, modelMatrix, viewMatrix, projectionMatrix, material.ior * (1.0 + 2.0 * uChromaticAberration * (i + randomCoords) / uRefractionSamples), material.thickness + thickness_smear * (i + randomCoords) / uRefractionSamples, - material.attenuationColor, material.attenuationDistance - ).b; - transmission.r += transmissionR; - transmission.g += transmissionG; - transmission.b += transmissionB; -} - -transmission /= uRefractionSamples; - -totalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission ); - -#endif`;const Oe=e=>{let n=e;return n=n.replace("#include ",` - vec3 objectNormal = usf_Normal; - #ifdef USE_TANGENT - vec3 objectTangent = vec3( tangent.xyz ); - #endif`),n=n.replace("#include ",` - vec3 transformed = usf_Position;`),n=n.replace("void main() {",` - uniform float uTime; - uniform float uWobblePositionFrequency; - uniform float uWobbleTimeFrequency; - uniform float uWobbleStrength; - uniform float uWarpPositionFrequency; - uniform float uWarpTimeFrequency; - uniform float uWarpStrength; - attribute vec4 tangent; - varying float vWobble; - varying vec2 vPosition; - // edge - varying vec3 vEdgeNormal; - varying vec3 vEdgeViewPosition; - #usf - void main() { - `),n=n.replace("void main() {",` - void main() { - vec3 usf_Position = position; - vec3 usf_Normal = normal; - vec3 biTangent = cross(normal, tangent.xyz); - - // Neighbours positions - float shift = 0.01; - vec3 positionA = usf_Position + tangent.xyz * shift; - vec3 positionB = usf_Position + biTangent * shift; - - // wobble - float wobble = (uWobbleStrength > 0.) ? getWobble(usf_Position) : 0.0; - float wobblePositionA = (uWobbleStrength > 0.) ? getWobble(positionA) : 0.0; - float wobblePositionB = (uWobbleStrength > 0.) ? getWobble(positionB) : 0.0; - - usf_Position += wobble * normal; - positionA += wobblePositionA * normal; - positionB += wobblePositionB * normal; - - // Compute normal - vec3 toA = normalize(positionA - usf_Position); - vec3 toB = normalize(positionB - usf_Position); - usf_Normal = cross(toA, toB); - - // Varying - vPosition = usf_Position.xy; - vWobble = wobble/uWobbleStrength; - - vEdgeNormal = normalize(normalMatrix * usf_Normal); - vec4 viewPosition = viewMatrix * modelMatrix * vec4(usf_Position, 1.0); - vEdgeViewPosition = normalize(viewPosition.xyz); - `),n},Yt=({baseMaterial:e,materialParameters:n,onBeforeCompile:t,depthOnBeforeCompile:r,isCustomTransmission:u=!1,uniforms:m})=>{const{material:l,depthMaterial:s}=i.useMemo(()=>{const v=new(e||o.MeshPhysicalMaterial)(n||{});Object.assign(v.userData,{uniforms:{uTime:{value:0},uWobblePositionFrequency:{value:W.wobblePositionFrequency},uWobbleTimeFrequency:{value:W.wobbleTimeFrequency},uWobbleStrength:{value:W.wobbleStrength},uWarpPositionFrequency:{value:W.warpPositionFrequency},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:W.chromaticAberration},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},...m}}),v.onBeforeCompile=(d,y)=>{Object.assign(d.uniforms,v.userData.uniforms),d.vertexShader=Oe(d.vertexShader),d.fragmentShader=d.fragmentShader.replace("#include ",` - #include - - if (uEdgeThreshold > 0.0) { - float edgeThreshold = dot(vEdgeNormal, -vEdgeViewPosition); - diffuseColor = edgeThreshold < uEdgeThreshold ? vec4(uEdgeColor, 1.0) : mix(diffuseColor, usf_DiffuseColor, uColorMix); - } else { - diffuseColor = mix(diffuseColor, usf_DiffuseColor, uColorMix); - } - `),d.fragmentShader=d.fragmentShader.replace("void main() {",` - uniform vec3 uColor0; - uniform vec3 uColor1; - uniform vec3 uColor2; - uniform vec3 uColor3; - uniform float uColorMix; - uniform float uEdgeThreshold; - uniform vec3 uEdgeColor; - - // transmission - uniform float uChromaticAberration; - uniform float uAnisotropicBlur; - uniform float uTime; - uniform float uDistortion; - uniform float uDistortionScale; - uniform float uTemporalDistortion; - uniform float uRefractionSamples; - - float rand(float n){return fract(sin(n) * 43758.5453123);} - #usf - - varying float vWobble; - varying vec2 vPosition; - varying vec3 vEdgeNormal; - varying vec3 vEdgeViewPosition; - - void main(){ - vec4 usf_DiffuseColor = vec4(1.0); - float colorWobbleMix = smoothstep(-1.,1.,vWobble); - vec2 colorPosMix = vec2(smoothstep(-1.,1.,vPosition.x),smoothstep(-1.,1.,vPosition.y)); - - usf_DiffuseColor.rgb = mix(mix(uColor0, uColor1, colorPosMix.x), mix(uColor2, uColor3, colorPosMix.y), colorWobbleMix); - `),v.type==="MeshPhysicalMaterial"&&u&&(d.fragmentShader=d.fragmentShader.replace("#include ",`${Xt}`),d.fragmentShader=d.fragmentShader.replace("#include ",`${Ht}`)),B(t)(d,y)},v.needsUpdate=!0;const g=new o.MeshDepthMaterial({depthPacking:o.RGBADepthPacking});return g.onBeforeCompile=(d,y)=>{Object.assign(d.uniforms,v.userData.uniforms),d.vertexShader=Oe(d.vertexShader),B(r)(d,y)},g.needsUpdate=!0,{material:v,depthMaterial:g}},[n,e,t,r,m,u]);return{material:l,depthMaterial:s}},Ue=({scene:e=!1,geometry:n,isCustomTransmission:t,baseMaterial:r,materialParameters:u,onBeforeCompile:m,depthOnBeforeCompile:l,uniforms:s})=>{const v=i.useMemo(()=>{let p=n||new o.IcosahedronGeometry(2,20);return p=Kt(p),p.computeTangents(),p},[n]),{material:g,depthMaterial:d}=Yt({baseMaterial:r,materialParameters:u,onBeforeCompile:m,depthOnBeforeCompile:l,uniforms:s,isCustomTransmission:t}),y=L(e,v,g,o.Mesh),M=g.userData,a=R(M),h=V(M);return[i.useCallback((p,f,w)=>{p&&a("uTime",(f==null?void 0:f.beat)||p.clock.getElapsedTime()),f!==void 0&&(a("uWobbleStrength",f.wobbleStrength),a("uWobblePositionFrequency",f.wobblePositionFrequency),a("uWobbleTimeFrequency",f.wobbleTimeFrequency),a("uWarpStrength",f.warpStrength),a("uWarpPositionFrequency",f.warpPositionFrequency),a("uWarpTimeFrequency",f.warpTimeFrequency),a("uColor0",f.color0),a("uColor1",f.color1),a("uColor2",f.color2),a("uColor3",f.color3),a("uColorMix",f.colorMix),a("uEdgeThreshold",f.edgeThreshold),a("uEdgeColor",f.edgeColor),a("uChromaticAberration",f.chromaticAberration),a("uAnisotropicBlur",f.anisotropicBlur),a("uDistortion",f.distortion),a("uDistortionScale",f.distortionScale),a("uRefractionSamples",f.refractionSamples),a("uTemporalDistortion",f.temporalDistortion),h(w))},[a,h]),{mesh:y,depthMaterial:d}]},W=Object.freeze({wobbleStrength:.3,wobblePositionFrequency:.3,wobbleTimeFrequency:.3,warpStrength:.3,warpPositionFrequency:.3,warpTimeFrequency:.3,color0:new o.Color(16711680),color1:new o.Color(65280),color2:new o.Color(255),color3:new o.Color(16776960),colorMix:1,edgeThreshold:0,edgeColor:new o.Color(0),chromaticAberration:.1,anisotropicBlur:.1,distortion:0,distortionScale:.1,temporalDistortion:0,refractionSamples:6,beat:!1}),Qt=({size:e,dpr:n,samples:t,isSizeUpdate:r,camera:u,geometry:m,baseMaterial:l,materialParameters:s,uniforms:v,onBeforeCompile:g,depthOnBeforeCompile:d,isCustomTransmission:y})=>{const M=U(n),a=i.useMemo(()=>new o.Scene,[]),[h,{mesh:c,depthMaterial:p}]=Ue({baseMaterial:l,materialParameters:s,scene:a,geometry:m,uniforms:v,onBeforeCompile:g,depthOnBeforeCompile:d,isCustomTransmission:y}),[f,w]=j({scene:a,camera:u,size:e,dpr:M.fbo,samples:t,isSizeUpdate:r,depthBuffer:!0}),b=i.useCallback((S,_,T)=>(h(S,_,T),w(S.gl)),[w,h]),x=i.useCallback((S,_)=>{h(null,S,_)},[h]);return[b,x,{scene:a,mesh:c,depthMaterial:p,renderTarget:f,output:f.texture}]},Zt=(e,n,t)=>{const r=i.useMemo(()=>{const u=new o.Mesh(n,t);return e.add(u),u},[n,t,e]);return i.useEffect(()=>()=>{e.remove(r),n.dispose(),t.dispose()},[e,n,t,r]),r},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 Jt(e){let n=Math.sin(e*12.9898)*43758.5453;return n-Math.floor(n)}const er=(e,n="easeOutQuart")=>{const t=e/60,r=de[n];return i.useCallback(m=>{let l=m.getElapsedTime()*t;const s=Math.floor(l),v=r(l-s);l=v+s;const g=Jt(s);return{beat:l,floor:s,fract:v,hash:g}},[t,r])},nr=(e=60)=>{const n=i.useMemo(()=>1/Math.max(Math.min(e,60),1),[e]),t=i.useRef(null);return i.useCallback(u=>{const m=u.getElapsedTime();return t.current===null||m-t.current>=n?(t.current=m,!0):!1},[n])},tr=e=>{var r,u;const n=(r=e.dom)==null?void 0:r.length,t=(u=e.texture)==null?void 0:u.length;return!n||!t||n!==t};var rr=`varying vec2 vUv; - -void main() { - vUv = uv; - gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0); -}`,or=`precision highp float; - -varying vec2 vUv; -uniform sampler2D u_texture; -uniform vec2 u_textureResolution; -uniform vec2 u_resolution; -uniform float u_borderRadius; - -void main() { - - float screenAspect = u_resolution.x / u_resolution.y; - float textureAspect = u_textureResolution.x / u_textureResolution.y; - vec2 ratio = vec2( - min(screenAspect / textureAspect, 1.0), - min(textureAspect / screenAspect, 1.0) - ); - - vec2 adjustedUv = vUv * ratio + (1.0 - ratio) * 0.5; - vec3 textureColor = texture2D(u_texture, adjustedUv).rgb; - float textureAlpha = texture2D(u_texture, adjustedUv).a; - - - float maxSide = max(u_resolution.x, u_resolution.y); - float minSide = min(u_resolution.x, u_resolution.y); - vec2 aspect = u_resolution / maxSide; - vec2 alphaUv = vUv - 0.5; - - float borderRadius = min(u_borderRadius, minSide * 0.5); - vec2 offset = vec2(borderRadius) / u_resolution; - vec2 alphaXY = smoothstep(vec2(0.5 - offset), vec2(0.5 - offset - 0.001), abs(alphaUv)); - float alpha = min(1.0, alphaXY.x + alphaXY.y); - - vec2 alphaUv2 = abs(vUv - 0.5); - float radius = borderRadius / maxSide; - alphaUv2 = (alphaUv2 - 0.5) * aspect + radius; - float roundAlpha = smoothstep(radius + 0.001, radius, length(alphaUv2)); - - alpha = min(1.0, alpha + roundAlpha); - - - alpha *= textureAlpha; - - gl_FragColor = vec4(textureColor, alpha); -}`;const ar=({params:e,scene:n,uniforms:t,onBeforeCompile:r})=>{n.children.length>0&&(n.children.forEach(u=>{u instanceof o.Mesh&&(u.geometry.dispose(),u.material.dispose())}),n.remove(...n.children)),e.texture.forEach((u,m)=>{const l=new o.ShaderMaterial({uniforms:{u_texture:{value:u},u_textureResolution:{value:new o.Vector2(0,0)},u_resolution:{value:new o.Vector2(0,0)},u_borderRadius:{value:e.boderRadius[m]?e.boderRadius[m]:0},...t},vertexShader:rr,fragmentShader:or,...z,transparent:!0});l.onBeforeCompile=B(r);const s=new o.Mesh(new o.PlaneGeometry(1,1),l);n.add(s)})},ur=()=>{const e=i.useRef([]),n=i.useRef([]);return i.useCallback(({isIntersectingRef:r,isIntersectingOnceRef:u,params:m})=>{e.current.length>0&&e.current.forEach((s,v)=>{s.unobserve(n.current[v])}),n.current=[],e.current=[];const l=new Array(m.dom.length).fill(!1);r.current=[...l],u.current=[...l],m.dom.forEach((s,v)=>{const g=y=>{y.forEach(M=>{m.onIntersect[v]&&m.onIntersect[v](M),r.current[v]=M.isIntersecting})},d=new IntersectionObserver(g,{rootMargin:"0px",threshold:0});d.observe(s),e.current.push(d),n.current.push(s)})},[])},ir=()=>{const e=i.useRef([]),n=i.useCallback(({params:t,customParams:r,size:u,resolutionRef:m,scene:l,isIntersectingRef:s})=>{l.children.length!==e.current.length&&(e.current=new Array(l.children.length)),l.children.forEach((v,g)=>{var M,a,h,c,p,f;const d=t.dom[g];if(!d)return;const y=d.getBoundingClientRect();if(e.current[g]=y,v.scale.set(y.width,y.height,1),v.position.set(y.left+y.width*.5-u.width*.5,-y.top-y.height*.5+u.height*.5,0),s.current[g]&&(t.rotation[g]&&v.rotation.copy(t.rotation[g]),v instanceof o.Mesh)){const w=v.material,b=R(w),x=V(w);b("u_texture",t.texture[g]),b("u_textureResolution",[((h=(a=(M=t.texture[g])==null?void 0:M.source)==null?void 0:a.data)==null?void 0:h.width)||0,((f=(p=(c=t.texture[g])==null?void 0:c.source)==null?void 0:p.data)==null?void 0:f.height)||0]),b("u_resolution",m.current.set(y.width,y.height)),b("u_borderRadius",t.boderRadius[g]?t.boderRadius[g]:0),x(r)}})},[]);return[e.current,n]},sr=()=>{const e=i.useRef([]),n=i.useRef([]),t=i.useCallback((r,u=!1)=>{e.current.forEach((l,s)=>{l&&(n.current[s]=!0)});const m=u?[...n.current]:[...e.current];return r<0?m:m[r]},[]);return{isIntersectingRef:e,isIntersectingOnceRef:n,isIntersecting:t}},lr=e=>({onView:t,onHidden:r})=>{const u=i.useRef(!1);i.useEffect(()=>{let m;const l=()=>{e.current.some(s=>s)?u.current||(t&&t(),u.current=!0):u.current&&(r&&r(),u.current=!1),m=requestAnimationFrame(l)};return m=requestAnimationFrame(l),()=>{cancelAnimationFrame(m)}},[t,r])},Ee={texture:[],dom:[],boderRadius:[],rotation:[],onIntersect:[]},cr=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m},l=[])=>{const s=U(n),v=i.useMemo(()=>new o.Scene,[]),g=k(e),[d,y]=j({scene:v,camera:g,size:e,dpr:s.fbo,samples:t,isSizeUpdate:r}),[M,a]=$({...Ee,updateKey:performance.now()}),[h,c]=ir(),p=i.useRef(new o.Vector2(0,0)),[f,w]=i.useState(!0);i.useMemo(()=>w(!0),l);const b=i.useRef(null),x=i.useMemo(()=>D,[]),S=ur(),{isIntersectingOnceRef:_,isIntersectingRef:T,isIntersecting:I}=sr(),A=lr(T),F=i.useMemo(()=>(O,q)=>{a(O),c({params:M,customParams:q,size:e,resolutionRef:p,scene:v,isIntersectingRef:T})},[T,a,c,e,v,M]);return[i.useCallback((O,q,ae)=>{const{gl:H,size:G}=O;if(F(q,ae),tr(M))return x;if(f){if(b.current===M.updateKey)return x;b.current=M.updateKey}return f&&(ar({params:M,size:G,scene:v,uniforms:u,onBeforeCompile:m}),S({isIntersectingRef:T,isIntersectingOnceRef:_,params:M}),w(!1)),y(H)},[y,u,S,m,f,v,M,_,T,x,F]),F,{scene:v,camera:g,renderTarget:d,output:d.texture,isIntersecting:I,DOMRects:h,intersections:T.current,useDomView:A}]},vr=({scene:e,camera:n,size:t,dpr:r=!1,isSizeUpdate:u=!1,samples:m=0,depthBuffer:l=!1,depthTexture:s=!1},v)=>{const g=i.useRef([]),d=X(t,r);g.current=i.useMemo(()=>Array.from({length:v},()=>{const M=new o.WebGLRenderTarget(d.x,d.y,{...me,samples:m,depthBuffer:l});return s&&(M.depthTexture=new o.DepthTexture(d.x,d.y,o.FloatType)),M}),[v]),u&&g.current.forEach(M=>M.setSize(d.x,d.y)),i.useEffect(()=>{const M=g.current;return()=>{M.forEach(a=>a.dispose())}},[v]);const y=i.useCallback((M,a,h)=>{const c=g.current[a];return he({gl:M,scene:e,camera:n,fbo:c,onBeforeRender:()=>h&&h({read:c.texture})}),c.texture},[e,n]);return[g.current,y]};C.ALPHABLENDING_PARAMS=Ae,C.BLANK_PARAMS=Fe,C.BLENDING_PARAMS=le,C.BRIGHTNESSPICKER_PARAMS=pe,C.BRUSH_PARAMS=Z,C.CHROMAKEY_PARAMS=Q,C.COLORSTRATA_PARAMS=Y,C.COSPALETTE_PARAMS=ie,C.COVERTEXTURE_PARAMS=Ie,C.DELTA_TIME=Se,C.DOMSYNCER_PARAMS=Ee,C.DUOTONE_PARAMS=xe,C.Easing=de,C.FBO_OPTION=me,C.FLUID_PARAMS=Pe,C.FXBLENDING_PARAMS=Ce,C.FXTEXTURE_PARAMS=te,C.HSV_PARAMS=Me,C.MARBLE_PARAMS=oe,C.MORPHPARTICLES_PARAMS=E,C.MOTIONBLUR_PARAMS=fe,C.NOISE_PARAMS=ne,C.RIPPLE_PARAMS=Re,C.SIMPLEBLUR_PARAMS=_e,C.WAVE_PARAMS=ce,C.WOBBLE3D_PARAMS=W,C.renderFBO=he,C.setCustomUniform=V,C.setUniform=R,C.useAddMesh=Zt,C.useAlphaBlending=mt,C.useBeat=er,C.useBlank=kt,C.useBlending=Yn,C.useBrightnessPicker=ot,C.useBrush=nn,C.useCamera=k,C.useChromaKey=Ot,C.useColorStrata=Bn,C.useCopyTexture=vr,C.useCosPalette=jn,C.useCoverTexture=yt,C.useCreateMorphParticles=ze,C.useCreateWobble3D=Ue,C.useDomSyncer=cr,C.useDoubleFBO=re,C.useDuoTone=Gn,C.useFPSLimiter=nr,C.useFluid=Sn,C.useFxBlending=st,C.useFxTexture=et,C.useHSV=gt,C.useMarble=En,C.useMorphParticles=Gt,C.useMotionBlur=Pt,C.useNoise=An,C.useParams=$,C.usePointer=ge,C.useResolution=X,C.useRipple=Tn,C.useSimpleBlur=_t,C.useSingleFBO=j,C.useWave=Ft,C.useWobble3D=Qt,Object.defineProperty(C,Symbol.toStringTag,{value:"Module"})}); -//# sourceMappingURL=use-shader-fx.umd.cjs.map diff --git a/packages/use-shader-fx/build/use-shader-fx.umd.cjs.map b/packages/use-shader-fx/build/use-shader-fx.umd.cjs.map deleted file mode 100644 index 47bffb47..00000000 --- a/packages/use-shader-fx/build/use-shader-fx.umd.cjs.map +++ /dev/null @@ -1 +0,0 @@ -{"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/planeVert.glsl","../src/libs/shaders/resolveShaders.ts","../src/utils/setOnBeforeCompile.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","../node_modules/three-stdlib/utils/BufferGeometryUtils.js","../src/fxs/3D/useWobble3D/shaders/transmission_pars_fragment.glsl","../src/fxs/3D/useWobble3D/shaders/transmission_fragment.glsl","../src/fxs/3D/useWobble3D/useMaterial.ts","../src/fxs/3D/useWobble3D/useCreateWobble3D.ts","../src/fxs/3D/useWobble3D/index.ts","../src/utils/useAddMesh.ts","../src/libs/easing.ts","../src/misc/useBeat.ts","../src/misc/useFPSLimiter.ts","../src/misc/useDomSyncer/utils/errorHandler.ts","../src/misc/useDomSyncer/shader/main.vert","../src/misc/useDomSyncer/shader/main.frag","../src/misc/useDomSyncer/utils/createMesh.ts","../src/misc/useDomSyncer/utils/useIntersectionHandler.ts","../src/misc/useDomSyncer/utils/useUpdateDomRect.ts","../src/misc/useDomSyncer/utils/useIsIntersecting.ts","../src/misc/useDomSyncer/utils/createUseDomView.ts","../src/misc/useDomSyncer/index.ts","../src/misc/useCopyTexture.ts"],"sourcesContent":["#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 const resolution = useMemo(\n () => new THREE.Vector2(_width, _height),\n [_width, _height]\n );\n return resolution;\n};\n","type UniformValue =\n | THREE.CubeTexture\n | THREE.Texture\n | Int32Array\n | Float32Array\n | THREE.Matrix4\n | THREE.Matrix3\n | THREE.Quaternion\n | THREE.Vector4\n | THREE.Vector3\n | THREE.Vector2\n | THREE.Color\n | number\n | boolean\n | Array\n | null\n | undefined;\ntype UniformObject = { [key: string]: { value: UniformValue } };\n\nexport const setUniform =\n (material: { uniforms: T }) =>\n (key: keyof T, value: UniformValue) => {\n if (value === undefined) {\n return;\n }\n 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}","import * as THREE from \"three\";\n\nimport wobble3D from \"./shaderChunk/wobble3D.glsl\";\nimport snoise from \"./shaderChunk/snoise.glsl\";\nimport coverTexture from \"./shaderChunk/coverTexture.glsl\";\nimport fxBlending from \"./shaderChunk/fxBlending.glsl\";\nimport planeVert from \"./shaderChunk/planeVert.glsl\";\n\nconst SHADER_CHUNK: { [key: string]: string } = {\n wobble3D,\n snoise,\n coverTexture,\n fxBlending,\n planeVert,\n};\n\nconst includePattern = /^[ \\t]*#usf +<([\\w\\d./]+)>/gm;\n\nfunction includeReplacer(match: string, include: string) {\n let string = SHADER_CHUNK[include] || \"\";\n return resolveIncludes(string);\n}\n\nfunction resolveIncludes(string: string) {\n return string.replace(includePattern, includeReplacer);\n}\n\nexport const resolveShaders = (shader: THREE.Shader) => {\n shader.vertexShader = resolveIncludes(shader.vertexShader);\n shader.fragmentShader = resolveIncludes(shader.fragmentShader);\n};\n","import { resolveShaders } from \"../libs/shaders/resolveShaders\";\n\ntype OnBeforeCompile = (\n shader: THREE.Shader,\n renderer: THREE.WebGLRenderer\n) => void;\n\nexport const setOnBeforeCompile = (\n onBeforeCompile?: OnBeforeCompile\n): OnBeforeCompile => {\n return (shader, renderer) => {\n onBeforeCompile && onBeforeCompile(shader, renderer);\n resolveShaders(shader);\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 { 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uBuffer: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent\n transparent: true,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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_OPTION: THREE.RenderTargetOptions = {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n type: THREE.HalfFloatType,\n stencilBuffer: false,\n};\n\nexport type UseFboProps = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n size: Size;\n /** If dpr is set, dpr will be multiplied, default : `false` */\n dpr?: number | false;\n /** Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false` */\n isSizeUpdate?: boolean;\n /** Defines the count of MSAA samples. Can only be used with WebGL 2. default : `0.0` */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, default : `false` */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. default : `false` */\n depthTexture?: boolean;\n};\n\nexport const renderFBO = ({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender,\n onSwap,\n}: {\n gl: THREE.WebGLRenderer;\n fbo: THREE.WebGLRenderTarget;\n scene: THREE.Scene;\n camera: THREE.Camera;\n onBeforeRender: () => void;\n onSwap?: () => void;\n}) => {\n gl.setRenderTarget(fbo);\n onBeforeRender();\n gl.clear();\n gl.render(scene, camera);\n onSwap && onSwap();\n gl.setRenderTarget(null);\n gl.clear();\n};\n\ntype UpdateRenderTarget = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseSingleFBOReturn = [THREE.WebGLRenderTarget, UpdateRenderTarget];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [THREE.WebGLRenderTarget , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useSingleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseSingleFBOReturn => {\n const renderTarget = useRef();\n\n const resolution = useResolution(size, dpr);\n\n renderTarget.current = useMemo(\n () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { FBO_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget | null;\n write: THREE.WebGLRenderTarget | null;\n};\n\ninterface WebGLDoubleRenderTarget extends DoubleRenderTarget {\n swap: () => void;\n}\n\ntype FBOUpdateFunction = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({\n read,\n write,\n }: {\n read: THREE.Texture;\n write: THREE.Texture;\n }) => void\n) => THREE.Texture;\n\ntype UseDoubleFBOReturn = [\n { read: THREE.WebGLRenderTarget; write: THREE.WebGLRenderTarget },\n FBOUpdateFunction\n];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default : `false`\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false`\n * @returns [{read:THREE.WebGLRenderTarget,write:THREE.WebGLRenderTarget} , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useDoubleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseDoubleFBOReturn => {\n const renderTarget = useRef({\n read: null,\n write: null,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n });\n\n const resolution = useResolution(size, dpr);\n\n const initRenderTargets = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n\n if (depthTexture) {\n read.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n write.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n\n return { read, write };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n renderTarget.current.read = initRenderTargets.read;\n renderTarget.current.write = initRenderTargets.write;\n\n if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, []);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current;\n renderFBO({\n gl,\n scene,\n camera,\n fbo: fbo.write!,\n onBeforeRender: () =>\n onBeforeRender &&\n onBeforeRender({\n read: fbo.read!.texture,\n write: fbo.write!.texture,\n }),\n onSwap: () => fbo.swap(),\n });\n return fbo.read?.texture as THREE.Texture;\n },\n [scene, camera]\n );\n\n return [\n { read: renderTarget.current.read, write: renderTarget.current.write },\n updateRenderTarget,\n ];\n};\n","import { Dpr } from \"../fxs/types\";\n\nexport const getDpr = (\n dpr: Dpr\n): { shader: number | false; fbo: number | false } => {\n if (typeof dpr === \"number\") {\n return { shader: dpr, fbo: dpr };\n }\n return {\n shader: dpr.shader ?? false,\n fbo: dpr.fbo ?? false,\n };\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { PointerValues, usePointer } from \"../../../misc/usePointer\";\nimport {\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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const pressureEnd = useRef(null);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class AdvectionMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uSource: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n dt: { value: number };\n dissipation: { value: number };\n };\n}\n\nexport const useAdvectionMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class DivergenceMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useDivergenceMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const divergenceMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class PressureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uDivergence: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const usePressureMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const pressureMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: null },\n uDivergence: { value: null },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class CurlMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useCurlMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const curlMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class VorticityMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uCurl: { value: THREE.Texture };\n curl: { value: number };\n dt: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useVorticityMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const vorticityMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n uCurl: { value: null },\n curl: { value: 0 },\n dt: { value: DELTA_TIME },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class ClearMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n value: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useClearMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n value: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class GradientSubtractMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useGradientSubtractMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const gradientSubtractMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: DEFAULT_TEXTURE },\n uVelocity: { value: DEFAULT_TEXTURE },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\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 = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const splatMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 density_dissipation?: number;\n /** velocity dissipation , default : `0.99` */\n velocity_dissipation?: number;\n /** velocity acceleration , default : `10.0` */\n velocity_acceleration?: number;\n /** pressure dissipation , default : `0.9` */\n pressure_dissipation?: number;\n /** pressure iterations. affects performance , default : `20` */\n pressure_iterations?: number;\n /** curl_strength , default : `35` */\n curl_strength?: number;\n /** splat radius , default : `0.002` */\n splat_radius?: number;\n /** Fluid Color.THREE.Vector3 Alternatively, it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default : `THREE.Vector3(1.0, 1.0, 1.0)` */\n fluid_color?:\n | ((velocity: THREE.Vector2) => THREE.Vector3)\n | THREE.Vector3\n | THREE.Color;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type FluidObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n materials: FluidMaterials;\n camera: THREE.Camera;\n renderTarget: {\n velocity: DoubleRenderTarget;\n density: DoubleRenderTarget;\n curl: THREE.WebGLRenderTarget;\n divergence: THREE.WebGLRenderTarget;\n pressure: DoubleRenderTarget;\n };\n output: THREE.Texture;\n};\n\nexport const FLUID_PARAMS: FluidParams = Object.freeze({\n density_dissipation: 0.98,\n velocity_dissipation: 0.99,\n velocity_acceleration: 10.0,\n pressure_dissipation: 0.9,\n pressure_iterations: 20,\n curl_strength: 35,\n splat_radius: 0.002,\n fluid_color: new THREE.Vector3(1.0, 1.0, 1.0),\n pointerValues: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFluid = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n customFluidProps,\n}: {\n /** you can add `onBeforeComile` of the next material.`initial`,`curl`,`vorticity`,`advection`,`divergence`,`pressure`,`clear`,`gradientSubtract`,`splat` \n\t * ```ts\n\t * fluidOnBeforeCompile: {\n vorticity: {\n onBeforeCompile: (shader) => console.log(shader),\n\t\t\t\tuniforms:{\n\t\t\t\t\thoge: { value: 0.0 },\n\t\t\t\t}\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 }),\n [scene, camera, size, samples, _dpr.fbo, isSizeUpdate]\n );\n const [velocityFBO, updateVelocityFBO] = useDoubleFBO(fboProps);\n const [densityFBO, updateDensityFBO] = useDoubleFBO(fboProps);\n const [curlFBO, updateCurlFBO] = useSingleFBO(fboProps);\n const [divergenceFBO, updateDivergenceFBO] = useSingleFBO(fboProps);\n const [pressureFBO, updatePressureFBO] = useDoubleFBO(fboProps);\n\n const 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.velocity_dissipation!\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.density_dissipation!\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.velocity_acceleration!)\n );\n updateParamsList.splat(\n \"color\",\n spaltVec.current.set(scaledDiff.x, scaledDiff.y, 1.0)\n );\n updateParamsList.splat(\"radius\", params.splat_radius!);\n });\n updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n updateParamsList.splat(\"uTarget\", read);\n const color: THREE.Vector3 | THREE.Color =\n typeof params.fluid_color === \"function\"\n ? params.fluid_color(pointerValues.velocity)\n : params.fluid_color!;\n 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.curl_strength!);\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.pressure_dissipation!);\n });\n\n setMeshMaterial(materials.pressureMaterial);\n updateParamsList.pressure(\"uDivergence\", divergenceTex);\n let pressureTexTemp: THREE.Texture;\n for (let i = 0; i < params.pressure_iterations!; 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","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}","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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\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 uniforms: {\n uOpacity: { value: 0.0 },\n uMap: { value: texture || DEFAULT_TEXTURE },\n ...uniforms,\n },\n blending: THREE.AdditiveBlending,\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent.\n transparent: true,\n });\n return mat;\n }, [texture, uniforms]);\n\n const meshArr = useMemo(() => {\n const temp = [];\n for (let i = 0; i < max; i++) {\n const clonedMat = material.clone();\n\n clonedMat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\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 }, [onBeforeCompile, 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 fadeout_speed?: number;\n /** scale rate, default : `0.3` */\n scale?: number;\n /** alpha, default : `0.6` */\n alpha?: number;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type RippleObject = {\n scene: THREE.Scene;\n meshArr: THREE.Mesh[];\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const RIPPLE_PARAMS: RippleParams = Object.freeze({\n frequency: 0.01,\n rotation: 0.05,\n fadeout_speed: 0.9,\n scale: 0.3,\n alpha: 0.6,\n pointerValues: false,\n});\n\ninterface UseRippleProps extends HooksProps {\n /** texture applied to ripple */\n texture?: THREE.Texture;\n /** ripple size, default:64 */\n scale?: number;\n /** ripple max length, default:100 */\n max?: number;\n}\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useRipple = ({\n texture,\n scale = 64,\n max = 100,\n size,\n dpr,\n samples,\n isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: UseRippleProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const 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.fadeout_speed! * mesh.scale.x + params.scale!;\n mesh.scale.y = mesh.scale.x;\n const opacity = material.uniforms.uOpacity.value;\n setUniform(material)(\n \"uOpacity\",\n opacity * params.fadeout_speed!\n );\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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTime: { value: 0.0 },\n scale: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: 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: { value: COLORSTRATA_PARAMS.laminateInterval },\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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateValue = setUniform(material);\n 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 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(MARBLE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(COSPALETTE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uColor0: { value: DUOTONE_PARAMS.color0 },\n uColor1: { value: DUOTONE_PARAMS.color1 },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { FXTEXTURE_PARAMS } from \".\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture0: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_brightness: { value: BRIGHTNESSPICKER_PARAMS.brightness },\n u_min: { value: BRIGHTNESSPICKER_PARAMS.min },\n u_max: { value: BRIGHTNESSPICKER_PARAMS.max },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n uMapIntensity: { value: FXBLENDING_PARAMS.mapIntensity },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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 uniforms,\n onBeforeCompile,\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 });\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\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\nvoid main() {\n\tvec4 tex = texture2D(u_texture, vUv);\n\tvec3 hsv = rgb2hsv(tex.rgb);\n\thsv.y *= u_saturation;\n\thsv.z *= u_brightness;\n\tvec3 final = hsv2rgb(hsv);\n\tgl_FragColor = vec4(final, tex.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { HSV_PARAMS } from \".\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_brightness: { value: HSV_PARAMS.brightness },\n u_saturation: { value: HSV_PARAMS.saturation },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n uniforms,\n onBeforeCompile,\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 });\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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture: { value: DEFAULT_TEXTURE },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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 uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] =\n useParams(COVERTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uBlurSize: { value: SIMPLEBLUR_PARAMS.blurSize },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n const 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 const iterations = params.blurPower!;\n for (let i = 0; i < iterations; i++) {\n updateValue(\"uTexture\", _tempTexture);\n _tempTexture = updateTempTexture(gl);\n }\n\n return _tempTexture;\n },\n [updateTempTexture, updateValue, 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(MOTIONBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uEpicenter: { value: WAVE_PARAMS.epicenter },\n uProgress: { value: WAVE_PARAMS.progress },\n uStrength: { value: WAVE_PARAMS.strength },\n uWidth: { value: WAVE_PARAMS.width },\n uMode: { value: 0 },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(CHROMAKEY_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene; size: Size; dpr: number | false } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uBackbuffer: { value: DEFAULT_TEXTURE },\n uTime: { value: 0 },\n uPointer: { value: new THREE.Vector2() },\n uResolution: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) as BlankMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { BlankMaterial, 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(BLANK_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n size: Size;\n dpr: number | false;\n geometry: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\n mapArray?: THREE.Texture[];\n} & MaterialProps) => {\n const modifiedPositions = useMemo(\n () => modifyAttributes(positions, geometry, \"position\", 3),\n [positions, geometry]\n );\n\n const modifiedUvs = useMemo(\n () => modifyAttributes(uvs, geometry, \"uv\", 2),\n [uvs, geometry]\n );\n\n const material = useMemo(() => {\n if (modifiedPositions.length !== modifiedUvs.length) {\n ISDEV &&\n console.log(\"use-shader-fx:positions and uvs are not matched\");\n }\n\n // vertex\n const rewritedVertexShader = rewriteVertexShader(\n modifiedUvs,\n geometry,\n \"uv\",\n rewriteVertexShader(\n modifiedPositions,\n geometry,\n \"position\",\n vertexShader,\n 3\n ),\n 2\n );\n\n // fragment\n const { rewritedFragmentShader, mapArrayUniforms } =\n rewriteFragmentShader(mapArray, fragmentShader);\n\n const mat = new THREE.ShaderMaterial({\n vertexShader: rewritedVertexShader,\n fragmentShader: rewritedFragmentShader,\n blending: THREE.AdditiveBlending,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent\n transparent: true,\n uniforms: {\n uResolution: { value: new THREE.Vector2(0, 0) },\n uMorphProgress: { value: MORPHPARTICLES_PARAMS.morphProgress },\n uBlurAlpha: { value: MORPHPARTICLES_PARAMS.blurAlpha },\n uBlurRadius: { value: MORPHPARTICLES_PARAMS.blurRadius },\n uPointSize: { value: MORPHPARTICLES_PARAMS.pointSize },\n uPointAlpha: { value: MORPHPARTICLES_PARAMS.pointAlpha },\n uPicture: { value: 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: { value: MORPHPARTICLES_PARAMS.wobbleStrength },\n uWarpPositionFrequency: {\n value: MORPHPARTICLES_PARAMS.warpPositionFrequency,\n },\n uWarpTimeFrequency: {\n value: MORPHPARTICLES_PARAMS.warpTimeFrequency,\n },\n uWarpStrength: { value: MORPHPARTICLES_PARAMS.warpStrength },\n uDisplacement: { value: 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: { value: MORPHPARTICLES_PARAMS.sizeRandomMin },\n uSizeRandomMax: { value: MORPHPARTICLES_PARAMS.sizeRandomMax },\n uDivergence: { value: MORPHPARTICLES_PARAMS.divergence },\n uDivergencePoint: { value: MORPHPARTICLES_PARAMS.divergencePoint },\n ...mapArrayUniforms,\n ...uniforms,\n },\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [\n geometry,\n modifiedPositions,\n modifiedUvs,\n mapArray,\n onBeforeCompile,\n uniforms,\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 uniforms,\n onBeforeCompile,\n}: Create3DHooksProps &\n UseCreateMorphParticlesProps): UseCreateMorphParticlesReturn => {\n const _dpr = getDpr(dpr);\n\n const morphGeometry = useMemo(() => {\n const geo = geometry || new THREE.SphereGeometry(1, 32, 32);\n geo.setIndex(null);\n // Since it is a particle, normal is not necessary\n geo.deleteAttribute(\"normal\");\n return geo;\n }, [geometry]);\n\n const { material, modifiedPositions, modifiedUvs } = useMaterial({\n size,\n dpr: _dpr.shader,\n geometry: morphGeometry,\n positions,\n uvs,\n mapArray,\n uniforms,\n onBeforeCompile,\n });\n\n const { points, interactiveMesh } = useCreateObject({\n scene,\n geometry: morphGeometry,\n material,\n });\n\n const updateValue = setUniform(material);\n const 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 camera,\n geometry,\n positions,\n uvs,\n uniforms,\n onBeforeCompile,\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 uniforms,\n onBeforeCompile,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n });\n\n const updateFx = useCallback(\n (\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 { BufferGeometry, BufferAttribute, InterleavedBuffer, InterleavedBufferAttribute, TrianglesDrawMode, TriangleFanDrawMode, TriangleStripDrawMode, Vector3, Float32BufferAttribute } from \"three\";\nimport { getWithKey } from \"../types/helpers.js\";\nconst mergeBufferGeometries = (geometries, useGroups) => {\n const isIndexed = geometries[0].index !== null;\n const attributesUsed = new Set(Object.keys(geometries[0].attributes));\n const morphAttributesUsed = new Set(Object.keys(geometries[0].morphAttributes));\n const attributes = {};\n const morphAttributes = {};\n const morphTargetsRelative = geometries[0].morphTargetsRelative;\n const mergedGeometry = new BufferGeometry();\n let offset = 0;\n geometries.forEach((geom, i) => {\n let attributesCount = 0;\n if (isIndexed !== (geom.index !== null)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.\"\n );\n return null;\n }\n for (let name in geom.attributes) {\n if (!attributesUsed.has(name)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.'\n );\n return null;\n }\n if (attributes[name] === void 0) {\n attributes[name] = [];\n }\n attributes[name].push(geom.attributes[name]);\n attributesCount++;\n }\n if (attributesCount !== attributesUsed.size) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". Make sure all geometries have the same number of attributes.\"\n );\n return null;\n }\n if (morphTargetsRelative !== geom.morphTargetsRelative) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". .morphTargetsRelative must be consistent throughout all geometries.\"\n );\n return null;\n }\n for (let name in geom.morphAttributes) {\n if (!morphAttributesUsed.has(name)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". .morphAttributes must be consistent throughout all geometries.\"\n );\n return null;\n }\n if (morphAttributes[name] === void 0)\n morphAttributes[name] = [];\n morphAttributes[name].push(geom.morphAttributes[name]);\n }\n mergedGeometry.userData.mergedUserData = mergedGeometry.userData.mergedUserData || [];\n mergedGeometry.userData.mergedUserData.push(geom.userData);\n if (useGroups) {\n let count;\n if (geom.index) {\n count = geom.index.count;\n } else if (geom.attributes.position !== void 0) {\n count = geom.attributes.position.count;\n } else {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". The geometry must have either an index or a position attribute\"\n );\n return null;\n }\n mergedGeometry.addGroup(offset, count, i);\n offset += count;\n }\n });\n if (isIndexed) {\n let indexOffset = 0;\n const mergedIndex = [];\n geometries.forEach((geom) => {\n const index = geom.index;\n for (let j = 0; j < index.count; ++j) {\n mergedIndex.push(index.getX(j) + indexOffset);\n }\n indexOffset += geom.attributes.position.count;\n });\n mergedGeometry.setIndex(mergedIndex);\n }\n for (let name in attributes) {\n const mergedAttribute = mergeBufferAttributes(attributes[name]);\n if (!mergedAttribute) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the \" + name + \" attribute.\"\n );\n return null;\n }\n mergedGeometry.setAttribute(name, mergedAttribute);\n }\n for (let name in morphAttributes) {\n const numMorphTargets = morphAttributes[name][0].length;\n if (numMorphTargets === 0)\n break;\n mergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n mergedGeometry.morphAttributes[name] = [];\n for (let i = 0; i < numMorphTargets; ++i) {\n const morphAttributesToMerge = [];\n for (let j = 0; j < morphAttributes[name].length; ++j) {\n morphAttributesToMerge.push(morphAttributes[name][j][i]);\n }\n const mergedMorphAttribute = mergeBufferAttributes(morphAttributesToMerge);\n if (!mergedMorphAttribute) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the \" + name + \" morphAttribute.\"\n );\n return null;\n }\n mergedGeometry.morphAttributes[name].push(mergedMorphAttribute);\n }\n }\n return mergedGeometry;\n};\nconst mergeBufferAttributes = (attributes) => {\n let TypedArray = void 0;\n let itemSize = void 0;\n let normalized = void 0;\n let arrayLength = 0;\n attributes.forEach((attr) => {\n if (TypedArray === void 0) {\n TypedArray = attr.array.constructor;\n }\n if (TypedArray !== attr.array.constructor) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.\"\n );\n return null;\n }\n if (itemSize === void 0)\n itemSize = attr.itemSize;\n if (itemSize !== attr.itemSize) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.\"\n );\n return null;\n }\n if (normalized === void 0)\n normalized = attr.normalized;\n if (normalized !== attr.normalized) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.\"\n );\n return null;\n }\n arrayLength += attr.array.length;\n });\n if (TypedArray && itemSize) {\n const array = new TypedArray(arrayLength);\n let offset = 0;\n attributes.forEach((attr) => {\n array.set(attr.array, offset);\n offset += attr.array.length;\n });\n return new BufferAttribute(array, itemSize, normalized);\n }\n};\nconst interleaveAttributes = (attributes) => {\n let TypedArray = void 0;\n let arrayLength = 0;\n let stride = 0;\n for (let i = 0, l = attributes.length; i < l; ++i) {\n const attribute = attributes[i];\n if (TypedArray === void 0)\n TypedArray = attribute.array.constructor;\n if (TypedArray !== attribute.array.constructor) {\n console.error(\"AttributeBuffers of different types cannot be interleaved\");\n return null;\n }\n arrayLength += attribute.array.length;\n stride += attribute.itemSize;\n }\n const interleavedBuffer = new InterleavedBuffer(new TypedArray(arrayLength), stride);\n let offset = 0;\n const res = [];\n const getters = [\"getX\", \"getY\", \"getZ\", \"getW\"];\n const setters = [\"setX\", \"setY\", \"setZ\", \"setW\"];\n for (let j = 0, l = attributes.length; j < l; j++) {\n const attribute = attributes[j];\n const itemSize = attribute.itemSize;\n const count = attribute.count;\n const iba = new InterleavedBufferAttribute(interleavedBuffer, itemSize, offset, attribute.normalized);\n res.push(iba);\n offset += itemSize;\n for (let c = 0; c < count; c++) {\n for (let k = 0; k < itemSize; k++) {\n const set = getWithKey(iba, setters[k]);\n const get = getWithKey(attribute, getters[k]);\n set(c, get(c));\n }\n }\n }\n return res;\n};\nfunction estimateBytesUsed(geometry) {\n let mem = 0;\n for (let name in geometry.attributes) {\n const attr = geometry.getAttribute(name);\n mem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n }\n const indices = geometry.getIndex();\n mem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n return mem;\n}\nfunction mergeVertices(geometry, tolerance = 1e-4) {\n tolerance = Math.max(tolerance, Number.EPSILON);\n const hashToIndex = {};\n const indices = geometry.getIndex();\n const positions = geometry.getAttribute(\"position\");\n const vertexCount = indices ? indices.count : positions.count;\n let nextIndex = 0;\n const attributeNames = Object.keys(geometry.attributes);\n const attrArrays = {};\n const morphAttrsArrays = {};\n const newIndices = [];\n const getters = [\"getX\", \"getY\", \"getZ\", \"getW\"];\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n const name = attributeNames[i];\n attrArrays[name] = [];\n const morphAttr = geometry.morphAttributes[name];\n if (morphAttr) {\n morphAttrsArrays[name] = new Array(morphAttr.length).fill(0).map(() => []);\n }\n }\n const decimalShift = Math.log10(1 / tolerance);\n const shiftMultiplier = Math.pow(10, decimalShift);\n for (let i = 0; i < vertexCount; i++) {\n const index = indices ? indices.getX(i) : i;\n let hash = \"\";\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const itemSize = attribute.itemSize;\n for (let k = 0; k < itemSize; k++) {\n hash += `${~~(attribute[getters[k]](index) * shiftMultiplier)},`;\n }\n }\n if (hash in hashToIndex) {\n newIndices.push(hashToIndex[hash]);\n } else {\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const morphAttr = geometry.morphAttributes[name];\n const itemSize = attribute.itemSize;\n const newarray = attrArrays[name];\n const newMorphArrays = morphAttrsArrays[name];\n for (let k = 0; k < itemSize; k++) {\n const getterFunc = getters[k];\n newarray.push(attribute[getterFunc](index));\n if (morphAttr) {\n for (let m = 0, ml = morphAttr.length; m < ml; m++) {\n newMorphArrays[m].push(morphAttr[m][getterFunc](index));\n }\n }\n }\n }\n hashToIndex[hash] = nextIndex;\n newIndices.push(nextIndex);\n nextIndex++;\n }\n }\n const result = geometry.clone();\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n const name = attributeNames[i];\n const oldAttribute = geometry.getAttribute(name);\n const buffer = new oldAttribute.array.constructor(attrArrays[name]);\n const attribute = new BufferAttribute(buffer, oldAttribute.itemSize, oldAttribute.normalized);\n result.setAttribute(name, attribute);\n if (name in morphAttrsArrays) {\n for (let j = 0; j < morphAttrsArrays[name].length; j++) {\n const oldMorphAttribute = geometry.morphAttributes[name][j];\n const buffer2 = new oldMorphAttribute.array.constructor(morphAttrsArrays[name][j]);\n const morphAttribute = new BufferAttribute(buffer2, oldMorphAttribute.itemSize, oldMorphAttribute.normalized);\n result.morphAttributes[name][j] = morphAttribute;\n }\n }\n }\n result.setIndex(newIndices);\n return result;\n}\nfunction toTrianglesDrawMode(geometry, drawMode) {\n if (drawMode === TrianglesDrawMode) {\n console.warn(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.\");\n return geometry;\n }\n if (drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode) {\n let index = geometry.getIndex();\n if (index === null) {\n const indices = [];\n const position = geometry.getAttribute(\"position\");\n if (position !== void 0) {\n for (let i = 0; i < position.count; i++) {\n indices.push(i);\n }\n geometry.setIndex(indices);\n index = geometry.getIndex();\n } else {\n console.error(\n \"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.\"\n );\n return geometry;\n }\n }\n const numberOfTriangles = index.count - 2;\n const newIndices = [];\n if (index) {\n if (drawMode === TriangleFanDrawMode) {\n for (let i = 1; i <= numberOfTriangles; i++) {\n newIndices.push(index.getX(0));\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n }\n } else {\n for (let i = 0; i < numberOfTriangles; i++) {\n if (i % 2 === 0) {\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i + 2));\n } else {\n newIndices.push(index.getX(i + 2));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i));\n }\n }\n }\n }\n if (newIndices.length / 3 !== numberOfTriangles) {\n console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.\");\n }\n const newGeometry = geometry.clone();\n newGeometry.setIndex(newIndices);\n newGeometry.clearGroups();\n return newGeometry;\n } else {\n console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:\", drawMode);\n return geometry;\n }\n}\nfunction computeMorphedAttributes(object) {\n if (object.geometry.isBufferGeometry !== true) {\n console.error(\"THREE.BufferGeometryUtils: Geometry is not of type BufferGeometry.\");\n return null;\n }\n const _vA = new Vector3();\n const _vB = new Vector3();\n const _vC = new Vector3();\n const _tempA = new Vector3();\n const _tempB = new Vector3();\n const _tempC = new Vector3();\n const _morphA = new Vector3();\n const _morphB = new Vector3();\n const _morphC = new Vector3();\n function _calculateMorphedAttributeData(object2, material2, attribute, morphAttribute, morphTargetsRelative2, a2, b2, c2, modifiedAttributeArray) {\n _vA.fromBufferAttribute(attribute, a2);\n _vB.fromBufferAttribute(attribute, b2);\n _vC.fromBufferAttribute(attribute, c2);\n const morphInfluences = object2.morphTargetInfluences;\n if (\n // @ts-ignore\n material2.morphTargets && morphAttribute && morphInfluences\n ) {\n _morphA.set(0, 0, 0);\n _morphB.set(0, 0, 0);\n _morphC.set(0, 0, 0);\n for (let i2 = 0, il2 = morphAttribute.length; i2 < il2; i2++) {\n const influence = morphInfluences[i2];\n const morph = morphAttribute[i2];\n if (influence === 0)\n continue;\n _tempA.fromBufferAttribute(morph, a2);\n _tempB.fromBufferAttribute(morph, b2);\n _tempC.fromBufferAttribute(morph, c2);\n if (morphTargetsRelative2) {\n _morphA.addScaledVector(_tempA, influence);\n _morphB.addScaledVector(_tempB, influence);\n _morphC.addScaledVector(_tempC, influence);\n } else {\n _morphA.addScaledVector(_tempA.sub(_vA), influence);\n _morphB.addScaledVector(_tempB.sub(_vB), influence);\n _morphC.addScaledVector(_tempC.sub(_vC), influence);\n }\n }\n _vA.add(_morphA);\n _vB.add(_morphB);\n _vC.add(_morphC);\n }\n if (object2.isSkinnedMesh) {\n object2.boneTransform(a2, _vA);\n object2.boneTransform(b2, _vB);\n object2.boneTransform(c2, _vC);\n }\n modifiedAttributeArray[a2 * 3 + 0] = _vA.x;\n modifiedAttributeArray[a2 * 3 + 1] = _vA.y;\n modifiedAttributeArray[a2 * 3 + 2] = _vA.z;\n modifiedAttributeArray[b2 * 3 + 0] = _vB.x;\n modifiedAttributeArray[b2 * 3 + 1] = _vB.y;\n modifiedAttributeArray[b2 * 3 + 2] = _vB.z;\n modifiedAttributeArray[c2 * 3 + 0] = _vC.x;\n modifiedAttributeArray[c2 * 3 + 1] = _vC.y;\n modifiedAttributeArray[c2 * 3 + 2] = _vC.z;\n }\n const geometry = object.geometry;\n const material = object.material;\n let a, b, c;\n const index = geometry.index;\n const positionAttribute = geometry.attributes.position;\n const morphPosition = geometry.morphAttributes.position;\n const morphTargetsRelative = geometry.morphTargetsRelative;\n const normalAttribute = geometry.attributes.normal;\n const morphNormal = geometry.morphAttributes.position;\n const groups = geometry.groups;\n const drawRange = geometry.drawRange;\n let i, j, il, jl;\n let group, groupMaterial;\n let start, end;\n const modifiedPosition = new Float32Array(positionAttribute.count * positionAttribute.itemSize);\n const modifiedNormal = new Float32Array(normalAttribute.count * normalAttribute.itemSize);\n if (index !== null) {\n if (Array.isArray(material)) {\n for (i = 0, il = groups.length; i < il; i++) {\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n start = Math.max(group.start, drawRange.start);\n end = Math.min(group.start + group.count, drawRange.start + drawRange.count);\n for (j = start, jl = end; j < jl; j += 3) {\n a = index.getX(j);\n b = index.getX(j + 1);\n c = index.getX(j + 2);\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else {\n start = Math.max(0, drawRange.start);\n end = Math.min(index.count, drawRange.start + drawRange.count);\n for (i = start, il = end; i < il; i += 3) {\n a = index.getX(i);\n b = index.getX(i + 1);\n c = index.getX(i + 2);\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else if (positionAttribute !== void 0) {\n if (Array.isArray(material)) {\n for (i = 0, il = groups.length; i < il; i++) {\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n start = Math.max(group.start, drawRange.start);\n end = Math.min(group.start + group.count, drawRange.start + drawRange.count);\n for (j = start, jl = end; j < jl; j += 3) {\n a = j;\n b = j + 1;\n c = j + 2;\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else {\n start = Math.max(0, drawRange.start);\n end = Math.min(positionAttribute.count, drawRange.start + drawRange.count);\n for (i = start, il = end; i < il; i += 3) {\n a = i;\n b = i + 1;\n c = i + 2;\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n }\n const morphedPositionAttribute = new Float32BufferAttribute(modifiedPosition, 3);\n const morphedNormalAttribute = new Float32BufferAttribute(modifiedNormal, 3);\n return {\n positionAttribute,\n normalAttribute,\n morphedPositionAttribute,\n morphedNormalAttribute\n };\n}\nfunction toCreasedNormals(geometry, creaseAngle = Math.PI / 3) {\n const creaseDot = Math.cos(creaseAngle);\n const hashMultiplier = (1 + 1e-10) * 100;\n const verts = [new Vector3(), new Vector3(), new Vector3()];\n const tempVec1 = new Vector3();\n const tempVec2 = new Vector3();\n const tempNorm = new Vector3();\n const tempNorm2 = new Vector3();\n function hashVertex(v) {\n const x = ~~(v.x * hashMultiplier);\n const y = ~~(v.y * hashMultiplier);\n const z = ~~(v.z * hashMultiplier);\n return `${x},${y},${z}`;\n }\n const resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;\n const posAttr = resultGeometry.attributes.position;\n const vertexMap = {};\n for (let i = 0, l = posAttr.count / 3; i < l; i++) {\n const i3 = 3 * i;\n const a = verts[0].fromBufferAttribute(posAttr, i3 + 0);\n const b = verts[1].fromBufferAttribute(posAttr, i3 + 1);\n const c = verts[2].fromBufferAttribute(posAttr, i3 + 2);\n tempVec1.subVectors(c, b);\n tempVec2.subVectors(a, b);\n const normal = new Vector3().crossVectors(tempVec1, tempVec2).normalize();\n for (let n = 0; n < 3; n++) {\n const vert = verts[n];\n const hash = hashVertex(vert);\n if (!(hash in vertexMap)) {\n vertexMap[hash] = [];\n }\n vertexMap[hash].push(normal);\n }\n }\n const normalArray = new Float32Array(posAttr.count * 3);\n const normAttr = new BufferAttribute(normalArray, 3, false);\n for (let i = 0, l = posAttr.count / 3; i < l; i++) {\n const i3 = 3 * i;\n const a = verts[0].fromBufferAttribute(posAttr, i3 + 0);\n const b = verts[1].fromBufferAttribute(posAttr, i3 + 1);\n const c = verts[2].fromBufferAttribute(posAttr, i3 + 2);\n tempVec1.subVectors(c, b);\n tempVec2.subVectors(a, b);\n tempNorm.crossVectors(tempVec1, tempVec2).normalize();\n for (let n = 0; n < 3; n++) {\n const vert = verts[n];\n const hash = hashVertex(vert);\n const otherNormals = vertexMap[hash];\n tempNorm2.set(0, 0, 0);\n for (let k = 0, lk = otherNormals.length; k < lk; k++) {\n const otherNorm = otherNormals[k];\n if (tempNorm.dot(otherNorm) > creaseDot) {\n tempNorm2.add(otherNorm);\n }\n }\n tempNorm2.normalize();\n normAttr.setXYZ(i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z);\n }\n }\n resultGeometry.setAttribute(\"normal\", normAttr);\n return resultGeometry;\n}\nexport {\n computeMorphedAttributes,\n estimateBytesUsed,\n interleaveAttributes,\n mergeBufferAttributes,\n mergeBufferGeometries,\n mergeVertices,\n toCreasedNormals,\n toTrianglesDrawMode\n};\n//# sourceMappingURL=BufferGeometryUtils.js.map\n","#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 { useMemo } from \"react\";\nimport transmission_pars_fragment from \"./shaders/transmission_pars_fragment.glsl\";\nimport transmission_fragment from \"./shaders/transmission_fragment.glsl\";\nimport { WOBBLE3D_PARAMS } from \".\";\nimport { MaterialProps } from \"../../types\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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\n/** You also need to rewrite the vertext shader of depthMaterial */\nconst rewriteVertex = (vertex: string) => {\n let shader = vertex;\n shader = shader.replace(\n \"#include \",\n `\n\t\tvec3 objectNormal = usf_Normal;\n\t\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t\t#endif`\n );\n // position\n shader = shader.replace(\n \"#include \",\n `\n\t\tvec3 transformed = usf_Position;`\n );\n\n // uniforms\n shader = shader.replace(\n \"void main() {\",\n `\n\t\tuniform float uTime;\n\t\tuniform float uWobblePositionFrequency;\n\t\tuniform float uWobbleTimeFrequency;\n\t\tuniform float uWobbleStrength;\n\t\tuniform float uWarpPositionFrequency;\n\t\tuniform float uWarpTimeFrequency;\n\t\tuniform float uWarpStrength;\n\t\tattribute vec4 tangent;\n\t\tvarying float vWobble;\n\t\tvarying vec2 vPosition;\n\t\t// edge\n\t\tvarying vec3 vEdgeNormal;\n\t\tvarying vec3 vEdgeViewPosition;\n\t\t#usf \n\t\tvoid main() {\n\t\t`\n );\n\n // vert\n shader = shader.replace(\n \"void main() {\",\n `\n\t\tvoid main() {\n\t\tvec3 usf_Position = position;\n\t\tvec3 usf_Normal = normal;\n\t\tvec3 biTangent = cross(normal, tangent.xyz);\n\t\t\n\t\t// Neighbours positions\n\t\tfloat shift = 0.01;\n\t\tvec3 positionA = usf_Position + tangent.xyz * shift;\n\t\tvec3 positionB = usf_Position + biTangent * shift;\n\t\t\n\t\t// wobble\n\t\tfloat wobble = (uWobbleStrength > 0.) ? getWobble(usf_Position) : 0.0;\n\t\tfloat wobblePositionA = (uWobbleStrength > 0.) ? getWobble(positionA) : 0.0;\n\t\tfloat wobblePositionB = (uWobbleStrength > 0.) ? getWobble(positionB) : 0.0;\n\t\t\n\t\tusf_Position += wobble * normal;\n\t\tpositionA += wobblePositionA * normal;\n\t\tpositionB += wobblePositionB * normal;\n\n\t\t// Compute normal\n\t\tvec3 toA = normalize(positionA - usf_Position);\n\t\tvec3 toB = normalize(positionB - usf_Position);\n\t\tusf_Normal = cross(toA, toB);\n\t\t\n\t\t// Varying\n\t\tvPosition = usf_Position.xy;\n\t\tvWobble = wobble/uWobbleStrength;\n\t\t\n\t\tvEdgeNormal = normalize(normalMatrix * usf_Normal);\n\t\tvec4 viewPosition = viewMatrix * modelMatrix * vec4(usf_Position, 1.0);\n\t\tvEdgeViewPosition = normalize(viewPosition.xyz);\n\t\t`\n );\n return shader;\n};\n\nexport type WobbleMaterialConstructor = new (opts: {\n [key: string]: any;\n}) => THREE.Material;\ntype WobbleMaterialParams =\n ConstructorParameters[0];\nexport interface WobbleMaterialProps\n extends MaterialProps {\n /** default:THREE.MeshPhysicalMaterial */\n baseMaterial?: T;\n materialParameters?: WobbleMaterialParams;\n /**\n * An optional callback that is executed immediately before the depth shader program is compiled.\n * @param shader — Source code of the shader\n * @param renderer — WebGLRenderer Context that is initializing the material\n */\n depthOnBeforeCompile?: (\n shader: THREE.Shader,\n renderer: THREE.WebGLRenderer\n ) => void;\n /**\n * 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 onBeforeCompile,\n depthOnBeforeCompile,\n isCustomTransmission = false,\n uniforms,\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 ...uniforms,\n },\n });\n\n mat.onBeforeCompile = (shader, renderer) => {\n Object.assign(shader.uniforms, mat.userData.uniforms);\n\n /********************\n\t\t\tvert\n\t\t\t********************/\n shader.vertexShader = rewriteVertex(shader.vertexShader);\n\n /********************\n\t\t\tfrag\n\t\t\t********************/\n // diffuse color , Manipulate color mixing ratio with `uColorMix`\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `\n\t\t\t\t\t#include \n\n\t\t\t\t\tif (uEdgeThreshold > 0.0) {\n\t\t\t\t\t\tfloat edgeThreshold = dot(vEdgeNormal, -vEdgeViewPosition);\n\t\t\t\t\t\tdiffuseColor = edgeThreshold < uEdgeThreshold ? vec4(uEdgeColor, 1.0) : mix(diffuseColor, usf_DiffuseColor, uColorMix);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdiffuseColor = mix(diffuseColor, usf_DiffuseColor, uColorMix);\n\t\t\t\t\t}\n\t\t\t\t`\n );\n\n // frag\n shader.fragmentShader = shader.fragmentShader.replace(\n \"void main() {\",\n `\n\t\t\t\tuniform vec3 uColor0;\n\t\t\t\tuniform vec3 uColor1;\n\t\t\t\tuniform vec3 uColor2;\n\t\t\t\tuniform vec3 uColor3;\n\t\t\t\tuniform float uColorMix;\n\t\t\t\tuniform float uEdgeThreshold;\n\t\t\t\tuniform vec3 uEdgeColor;\n\t\t\t\t\n\t\t\t\t// transmission\n\t\t\t\tuniform float uChromaticAberration; \n\t\t\t\tuniform float uAnisotropicBlur; \n\t\t\t\tuniform float uTime;\n\t\t\t\tuniform float uDistortion;\n\t\t\t\tuniform float uDistortionScale;\n\t\t\t\tuniform float uTemporalDistortion;\n\t\t\t\tuniform float uRefractionSamples;\n\t\t\t\t\n\t\t\t\tfloat rand(float n){return fract(sin(n) * 43758.5453123);}\n\t\t\t\t#usf \n\n\t\t\t\tvarying float vWobble;\n\t\t\t\tvarying vec2 vPosition;\n\t\t\t\tvarying vec3 vEdgeNormal;\n\t\t\t\tvarying vec3 vEdgeViewPosition;\n\t\t\t\t\n\t\t\t\tvoid main(){\n\t\t\t\t\tvec4 usf_DiffuseColor = vec4(1.0);\n\t\t\t\t\tfloat colorWobbleMix = smoothstep(-1.,1.,vWobble);\n\t\t\t\t\tvec2 colorPosMix = vec2(smoothstep(-1.,1.,vPosition.x),smoothstep(-1.,1.,vPosition.y));\n\t\t\t\t\n\t\t\t\t\tusf_DiffuseColor.rgb = mix(mix(uColor0, uColor1, colorPosMix.x), mix(uColor2, uColor3, colorPosMix.y), colorWobbleMix);\n\t\t\t\t`\n );\n\n // custom transmission\n if (mat.type === \"MeshPhysicalMaterial\" && isCustomTransmission) {\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `${transmission_pars_fragment}`\n );\n\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `${transmission_fragment}`\n );\n }\n\n setOnBeforeCompile(onBeforeCompile)(shader, renderer);\n };\n mat.needsUpdate = true;\n\n /*===============================================\n\t\tdepthMaterial\n\t\t===============================================*/\n const depthMat = new THREE.MeshDepthMaterial({\n depthPacking: THREE.RGBADepthPacking,\n });\n depthMat.onBeforeCompile = (shader, renderer) => {\n Object.assign(shader.uniforms, mat.userData.uniforms);\n shader.vertexShader = rewriteVertex(shader.vertexShader);\n setOnBeforeCompile(depthOnBeforeCompile)(shader, renderer);\n };\n depthMat.needsUpdate = true;\n\n return { material: mat, depthMaterial: depthMat };\n }, [\n materialParameters,\n baseMaterial,\n onBeforeCompile,\n depthOnBeforeCompile,\n uniforms,\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 onBeforeCompile,\n depthOnBeforeCompile,\n uniforms,\n}: UseCreateWobble3DProps &\n Create3DHooksProps &\n WobbleMaterialProps): UseCreateWobble3DReturn => {\n const wobbleGeometry = useMemo(() => {\n let geo = geometry || new THREE.IcosahedronGeometry(2, 20);\n geo = mergeVertices(geo);\n geo.computeTangents();\n return geo;\n }, [geometry]);\n const { material, depthMaterial } = useMaterial({\n baseMaterial,\n materialParameters,\n onBeforeCompile,\n depthOnBeforeCompile,\n uniforms,\n isCustomTransmission,\n });\n\n const mesh = useAddObject(scene, wobbleGeometry, material, THREE.Mesh);\n\n const userData = material.userData as Wobble3DMaterial;\n const updateValue = setUniform(userData);\n const 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 isSizeUpdate,\n camera,\n geometry,\n baseMaterial,\n materialParameters,\n uniforms,\n onBeforeCompile,\n depthOnBeforeCompile,\n isCustomTransmission,\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 uniforms,\n onBeforeCompile,\n depthOnBeforeCompile,\n isCustomTransmission,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n });\n\n const updateFx = useCallback(\n (\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","export type EasingTypes =\n | \"easeInSine\"\n | \"easeOutSine\"\n | \"easeInOutSine\"\n | \"easeInQuad\"\n | \"easeOutQuad\"\n | \"easeInOutQuad\"\n | \"easeInCubic\"\n | \"easeOutCubic\"\n | \"easeInOutCubic\"\n | \"easeInQuart\"\n | \"easeOutQuart\"\n | \"easeInOutQuart\"\n | \"easeInQuint\"\n | \"easeOutQuint\"\n | \"easeInOutQuint\"\n | \"easeInExpo\"\n | \"easeOutExpo\"\n | \"easeInOutExpo\"\n | \"easeInCirc\"\n | \"easeOutCirc\"\n | \"easeInOutCirc\"\n | \"easeInBack\"\n | \"easeOutBack\"\n | \"easeInOutBack\"\n | \"easeInElastic\"\n | \"easeOutElastic\"\n | \"easeInOutElastic\"\n | \"easeInBounce\"\n | \"easeOutBounce\"\n | \"easeInOutBounce\";\n\ntype EasingFunctions = {\n [K in EasingTypes]: (x: number) => number;\n};\n\n/**\n * from https://github.com/ai/easings.net\n */\nexport const Easing: EasingFunctions = Object.freeze({\n easeInSine(x: number): number {\n return 1 - Math.cos((x * Math.PI) / 2);\n },\n easeOutSine(x: number): number {\n return Math.sin((x * Math.PI) / 2);\n },\n easeInOutSine(x: number): number {\n return -(Math.cos(Math.PI * x) - 1) / 2;\n },\n easeInQuad(x: number): number {\n return x * x;\n },\n easeOutQuad(x: number): number {\n return 1 - (1 - x) * (1 - x);\n },\n easeInOutQuad(x: number): number {\n return x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2;\n },\n easeInCubic(x: number): number {\n return x * x * x;\n },\n easeOutCubic(x: number): number {\n return 1 - Math.pow(1 - x, 3);\n },\n easeInOutCubic(x: number): number {\n return x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2;\n },\n easeInQuart(x: number): number {\n return x * x * x * x;\n },\n easeOutQuart(x: number): number {\n return 1 - Math.pow(1 - x, 4);\n },\n easeInOutQuart(x: number): number {\n return x < 0.5 ? 8 * x * x * x * x : 1 - Math.pow(-2 * x + 2, 4) / 2;\n },\n easeInQuint(x: number): number {\n return x * x * x * x * x;\n },\n easeOutQuint(x: number): number {\n return 1 - Math.pow(1 - x, 5);\n },\n easeInOutQuint(x: number): number {\n return x < 0.5 ? 16 * x * x * x * x * x : 1 - Math.pow(-2 * x + 2, 5) / 2;\n },\n easeInExpo(x: number): number {\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\n },\n easeOutExpo(x: number): number {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n },\n easeInOutExpo(x: number): number {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? Math.pow(2, 20 * x - 10) / 2\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\n },\n easeInCirc(x: number): number {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n },\n easeOutCirc(x: number): number {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n },\n easeInOutCirc(x: number): number {\n return x < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\n },\n easeInBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return c3 * x * x * x - c1 * x * x;\n },\n easeOutBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return 1 + c3 * Math.pow(x - 1, 3) + c1 * Math.pow(x - 1, 2);\n },\n easeInOutBack(x: number): number {\n const c1 = 1.70158;\n const c2 = c1 * 1.525;\n\n return x < 0.5\n ? (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2\n : (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2;\n },\n easeInElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\n },\n easeOutElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1;\n },\n easeInOutElastic(x: number): number {\n const c5 = (2 * Math.PI) / 4.5;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * c5)) / 2\n : (Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * c5)) / 2 +\n 1;\n },\n easeInBounce(x: number): number {\n return 1 - Easing.easeOutBounce(1 - x);\n },\n easeOutBounce(x: number): number {\n const n1 = 7.5625;\n const d1 = 2.75;\n\n if (x < 1 / d1) {\n return n1 * x * x;\n } else if (x < 2 / d1) {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n } else if (x < 2.5 / d1) {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n } else {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n },\n easeInOutBounce(x: number): number {\n return x < 0.5\n ? (1 - Easing.easeOutBounce(1 - 2 * x)) / 2\n : (1 + Easing.easeOutBounce(2 * x - 1)) / 2;\n },\n});\n","import * as THREE from \"three\";\nimport { Easing, EasingTypes } from \"../libs/easing\";\nimport { useCallback } from \"react\";\n\n/** Returns a unique hash specific to the beat */\nfunction getHash(input: number) {\n let n = Math.sin(input * 12.9898) * 43758.5453;\n return n - Math.floor(n);\n}\n\ntype BeatValues = {\n beat: number;\n floor: number;\n fract: number;\n /** unique hash specific to the beat */\n hash: number;\n};\n\n/**\n * @param ease easing functions are referenced from https://github.com/ai/easings.net , default : \"easeOutQuart\"\n */\nexport const useBeat = (bpm: number, ease: EasingTypes = \"easeOutQuart\") => {\n const rhythm = bpm / 60;\n const easing = Easing[ease];\n const updateBeat = useCallback(\n (clock: THREE.Clock) => {\n let beat = clock.getElapsedTime() * rhythm;\n const floor = Math.floor(beat);\n const fract = easing(beat - floor);\n beat = fract + floor;\n const hash = getHash(floor);\n return {\n beat,\n floor,\n fract,\n hash,\n } as BeatValues;\n },\n [rhythm, easing]\n );\n return updateBeat;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo, useRef } from \"react\";\n\n/**\n * @param fps FPS you want to limit , default : `60`\n *\n * ```tsx\n * const limiter = useFPSLimiter(fps);\n * useFrame((props) => {\n * if (limiter(props.clock)) {\n *\t\t //some code\n * }\n * });\n * ```\n */\nexport const useFPSLimiter = (fps: number = 60) => {\n const interval = useMemo(() => 1 / Math.max(Math.min(fps, 60), 1), [fps]);\n const prevTime = useRef(null);\n\n const limiter = useCallback(\n (clock: THREE.Clock) => {\n const tick = clock.getElapsedTime();\n if (prevTime.current === null) {\n prevTime.current = tick;\n return true;\n }\n const deltaTime = tick - prevTime.current;\n if (deltaTime >= interval) {\n prevTime.current = tick;\n return true;\n }\n return false;\n },\n [interval]\n );\n\n return limiter;\n};\n","import { DomSyncerParams } from \"..\";\n\nexport const errorHandler = (params: DomSyncerParams) => {\n const domLength = params.dom?.length;\n const textureLength = params.texture?.length;\n\n if (!domLength || !textureLength) {\n return true;\n }\n\n if (domLength !== textureLength) {\n return true;\n }\n\n return false;\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec2 u_textureResolution;\nuniform vec2 u_resolution;\nuniform float u_borderRadius;\n\nvoid main() {\n\t// texuture color\n\tfloat screenAspect = u_resolution.x / u_resolution.y;\n\tfloat textureAspect = u_textureResolution.x / u_textureResolution.y;\n\tvec2 ratio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\n\tvec2 adjustedUv = vUv * ratio + (1.0 - ratio) * 0.5;\n\tvec3 textureColor = texture2D(u_texture, adjustedUv).rgb;\n\tfloat textureAlpha = texture2D(u_texture, adjustedUv).a;\n\n\t// Based on https://mofu-dev.com/en/blog/three-dom-alignment/\n\tfloat maxSide = max(u_resolution.x, u_resolution.y);\n\tfloat minSide = min(u_resolution.x, u_resolution.y);\n\tvec2 aspect = u_resolution / maxSide;\n\tvec2 alphaUv = vUv - 0.5;\n\n\tfloat borderRadius = min(u_borderRadius, minSide * 0.5);\n\tvec2 offset = vec2(borderRadius) / u_resolution;\n\tvec2 alphaXY = smoothstep(vec2(0.5 - offset), vec2(0.5 - offset - 0.001), abs(alphaUv));\n\tfloat alpha = min(1.0, alphaXY.x + alphaXY.y);\n\n\tvec2 alphaUv2 = abs(vUv - 0.5);\n\tfloat radius = borderRadius / maxSide;\n\talphaUv2 = (alphaUv2 - 0.5) * aspect + radius;\n\tfloat roundAlpha = smoothstep(radius + 0.001, radius, length(alphaUv2));\n\n\talpha = min(1.0, alpha + roundAlpha);\n\n\t// multiply texture alpha\n\talpha *= textureAlpha;\n\n\tgl_FragColor = vec4(textureColor, alpha);\n}\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"../\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"../shader/main.vert\";\nimport fragmentShader from \"../shader/main.frag\";\nimport { MaterialProps } from \"../../../fxs/types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../libs/constants\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n params: DomSyncerParams;\n size: Size;\n scene: THREE.Scene;\n} & MaterialProps) => {\n if (scene.children.length > 0) {\n scene.children.forEach((child) => {\n if (child instanceof THREE.Mesh) {\n child.geometry.dispose();\n child.material.dispose();\n }\n });\n scene.remove(...scene.children);\n }\n\n params.texture!.forEach((texture, i) => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: texture },\n u_textureResolution: {\n value: new THREE.Vector2(0, 0),\n },\n u_resolution: { value: new THREE.Vector2(0, 0) },\n u_borderRadius: {\n value: params.boderRadius![i] ? params.boderRadius![i] : 0.0,\n },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent.\n transparent: true,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n const mesh = new THREE.Mesh(new THREE.PlaneGeometry(1, 1), mat);\n scene.add(mesh);\n });\n};\n","import { useCallback, useRef } from \"react\";\nimport { DomSyncerParams } from \"..\";\n\nexport const useIntersectionHandler = () => {\n const intersectionObserverRef = useRef([]);\n const intersectionDomRef = useRef<(HTMLElement | Element | null)[]>([]);\n\n const intersectionHandler = useCallback(\n ({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n }: {\n isIntersectingRef: React.MutableRefObject;\n isIntersectingOnceRef: React.MutableRefObject;\n params: DomSyncerParams;\n }) => {\n if (intersectionObserverRef.current.length > 0) {\n intersectionObserverRef.current.forEach((observer, i) => {\n observer.unobserve(intersectionDomRef.current[i]!);\n });\n }\n\n intersectionDomRef.current = [];\n intersectionObserverRef.current = [];\n\n const newArr = new Array(params.dom!.length).fill(false);\n isIntersectingRef.current = [...newArr];\n isIntersectingOnceRef.current = [...newArr];\n\n params.dom!.forEach((dom, i) => {\n const callback = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n params.onIntersect![i] && params.onIntersect![i](entry);\n // Update the judgment after execution so that the judgment of isIntersectin can be used when executing onIntersect\n isIntersectingRef.current[i] = entry.isIntersecting;\n });\n };\n const observer = new IntersectionObserver(callback, {\n rootMargin: \"0px\",\n threshold: 0,\n });\n observer.observe(dom!);\n intersectionObserverRef.current.push(observer);\n intersectionDomRef.current.push(dom!);\n });\n },\n []\n );\n\n return intersectionHandler;\n};\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"..\";\nimport { Size } from \"@react-three/fiber\";\nimport {\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, samples, isSizeUpdate, uniforms, onBeforeCompile }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n const [params, setParams] = useParams({\n ...DOMSYNCER_PARAMS,\n updateKey: performance.now(),\n });\n\n const [DOMRects, updateDomRects] = useUpdateDomRect();\n\n // Avoid instancing vec2 every frame\n const resolutionRef = useRef(new THREE.Vector2(0, 0));\n\n // Update monitored doms according to the dependency array\n const [refreshTrigger, setRefreshTrigger] = useState(true);\n useMemo(\n () => setRefreshTrigger(true),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n dependencies\n );\n\n // If the dependencies have been updated but the key has not been updated, skip processing and return an empty texture\n const updateKey = useRef(null);\n const emptyTexture = useMemo(() => 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 uniforms,\n onBeforeCompile,\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 uniforms,\n intersectionHandler,\n onBeforeCompile,\n refreshTrigger,\n scene,\n params,\n isIntersectingOnceRef,\n isIntersectingRef,\n emptyTexture,\n updateParams,\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 { UseFboProps, renderFBO, FBO_OPTION } from \"../utils/useSingleFBO\";\n\ntype UpdateCopyFunction = (\n gl: THREE.WebGLRenderer,\n index: number,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseCopyTextureReturn = [THREE.WebGLRenderTarget[], UpdateCopyFunction];\n\n/**\n * Generate an FBO array to copy the texture.\n * @param dpr If dpr is set, dpr will be multiplied, default : `false`\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false`\n * @param length The number of FBOs to create\n * @returns [THREE.WebGLRenderTarget[] , updateCopyTexture] - Receives the RenderTarget array as the first argument and the update function as the second argument. `updateCopyTexture()` receives gl as the first argument and the index of the texture you want to copy as the second argument.\n */\nexport const useCopyTexture = (\n {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n }: UseFboProps,\n length: number\n): UseCopyTextureReturn => {\n const renderTargetArr = useRef([]);\n const resolution = useResolution(size, dpr);\n\n renderTargetArr.current = useMemo(() => {\n return Array.from({ length }, () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [length]);\n\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","setUniform","material","key","value","uniforms","setCustomUniform","customParams","useAddObject","scene","geometry","Proto","object3D","obj","useEffect","ISDEV","MATERIAL_BASIC_PARAMS","DEFAULT_TEXTURE","wobble3D_default","snoise_default","coverTexture_default","fxBlending_default","planeVert_default","SHADER_CHUNK","wobble3D","snoise","coverTexture","fxBlending","planeVert","includePattern","includeReplacer","match","include","string","resolveIncludes","resolveShaders","shader","setOnBeforeCompile","onBeforeCompile","renderer","useMesh","mat","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_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","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","iterations","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","mergeVertices","tolerance","hashToIndex","indices","vertexCount","nextIndex","attributeNames","attrArrays","morphAttrsArrays","newIndices","getters","l","name","morphAttr","decimalShift","shiftMultiplier","hash","k","newarray","newMorphArrays","getterFunc","m","ml","result","oldAttribute","buffer","BufferAttribute","oldMorphAttribute","buffer2","morphAttribute","transmission_pars_fragment_default","transmission_fragment_default","rewriteVertex","vertex","baseMaterial","materialParameters","depthOnBeforeCompile","isCustomTransmission","depthMaterial","WOBBLE3D_PARAMS","transmission_pars_fragment","transmission_fragment","depthMat","useCreateWobble3D","wobbleGeometry","userData","useWobble3D","RootState","useAddMesh","Easing","x","c2","c4","c5","getHash","input","useBeat","bpm","ease","rhythm","easing","beat","floor","fract","useFPSLimiter","fps","interval","prevTime","tick","errorHandler","domLength","textureLength","createMesh","child","useIntersectionHandler","intersectionObserverRef","intersectionDomRef","isIntersectingRef","isIntersectingOnceRef","observer","newArr","dom","callback","entries","entry","useUpdateDomRect","domRects","updateDomRects","resolutionRef","domElement","rect","useIsIntersecting","isIntersecting","once","createUseDomView","onView","onHidden","isView","id","filterIntersection","item","DOMSYNCER_PARAMS","useDomSyncer","dependencies","DOMRects","refreshTrigger","setRefreshTrigger","useState","updateKey","emptyTexture","intersectionHandler","useDomView","useCopyTexture","length","renderTargetArr","updateCopyTexture"],"mappings":"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","x_google_ignoreList":[123]} \ 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 66bddfc4..fe1457a8 100644 --- a/packages/use-shader-fx/package-lock.json +++ b/packages/use-shader-fx/package-lock.json @@ -12,10 +12,10 @@ "@types/node": "20.5.6", "@types/react": "18.2.21", "@types/react-dom": "18.2.7", - "@types/three": "^0.155.1", + "@types/three": "^0.164.0", "eslint": "8.47.0", "raw-loader": "^4.0.2", - "typescript": "5.2.2", + "typescript": "^5.2.2", "vite": "^4.5.0", "vite-plugin-glsl": "^1.1.2" }, @@ -23,7 +23,7 @@ "@react-three/fiber": ">=8.13.0", "react": ">=18.0", "react-dom": ">=18.0", - "three": ">=0.155.0", + "three": ">=0.162.0", "three-stdlib": ">=2.29.5" } }, @@ -660,9 +660,9 @@ } }, "node_modules/@tweenjs/tween.js": { - "version": "18.6.4", - "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-18.6.4.tgz", - "integrity": "sha512-lB9lMjuqjtuJrx7/kOkqQBtllspPIN+96OvTCeJ2j5FEzinoAXTdAMFnDAQT1KVPRlnYfBrqxtqP66vDM40xxQ==", + "version": "23.1.2", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.2.tgz", + "integrity": "sha512-kMCNaZCJugWI86xiEHaY338CU5JpD0B97p1j1IKNn/Zto8PgACjQx0UxbHjmOcLl/dDOBnItwD07KmCs75pxtQ==", "dev": true }, "node_modules/@types/draco3d": { @@ -756,25 +756,30 @@ "integrity": "sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==" }, "node_modules/@types/stats.js": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.2.tgz", - "integrity": "sha512-j1oI+BOPiAAAKFysNNutE9aAIjvHqqILubCs2EeHKc19pi4uybaGAgBfLXsCgJYcyKWkiilEvl8CkFF/SL+baA==", + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.3.tgz", + "integrity": "sha512-pXNfAD3KHOdif9EQXZ9deK82HVNaXP5ZIF5RP2QG6OQFNTaY2YIetfrE9t528vEreGQvEPRDDc8muaoYeK0SxQ==", "dev": true }, "node_modules/@types/three": { - "version": "0.155.1", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.155.1.tgz", - "integrity": "sha512-uNUwnz/wWRxahjIqTtDYQ1qdE1R1py21obxfuILkT+kKrjocMwRLQQA1l8nMxfQU7VXb7CXu04ucMo8OqZt4ZA==", + "version": "0.164.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.164.0.tgz", + "integrity": "sha512-SFDofn9dJVrE+1DKta7xj7lc4ru7B3S3yf10NsxOserW57aQlB6GxtAS1UK5To3LfEMN5HUHMu3n5v+M5rApgA==", "dev": true, "dependencies": { - "@tweenjs/tween.js": "~18.6.4", + "@tweenjs/tween.js": "~23.1.1", "@types/stats.js": "*", "@types/webxr": "*", - "fflate": "~0.6.9", - "lil-gui": "~0.17.0", + "fflate": "~0.8.2", "meshoptimizer": "~0.18.1" } }, + "node_modules/@types/three/node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "dev": true + }, "node_modules/@types/webxr": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.7.tgz", @@ -1586,7 +1591,8 @@ "node_modules/fflate": { "version": "0.6.10", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", - "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==" + "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==", + "peer": true }, "node_modules/file-entry-cache": { "version": "6.0.1", @@ -1955,12 +1961,6 @@ "node": ">= 0.8.0" } }, - "node_modules/lil-gui": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/lil-gui/-/lil-gui-0.17.0.tgz", - "integrity": "sha512-MVBHmgY+uEbmJNApAaPbtvNh1RCAeMnKym82SBjtp5rODTYKWtM+MXHCifLe2H2Ti1HuBGBtK/5SyG4ShQ3pUQ==", - "dev": true - }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -2704,9 +2704,9 @@ "dev": true }, "node_modules/three": { - "version": "0.155.0", - "resolved": "https://registry.npmjs.org/three/-/three-0.155.0.tgz", - "integrity": "sha512-sNgCYmDijnIqkD/bMfk+1pHg3YzsxW7V2ChpuP6HCQ8NiZr3RufsXQr8M3SSUMjW4hG+sUk7YbyuY0DncaDTJQ==", + "version": "0.164.1", + "resolved": "https://registry.npmjs.org/three/-/three-0.164.1.tgz", + "integrity": "sha512-iC/hUBbl1vzFny7f5GtqzVXYjMJKaTPxiCxXfrvVdBi1Sf+jhd1CAkitiFwC7mIBFCo3MrDLJG97yisoaWig0w==", "peer": true }, "node_modules/three-stdlib": { diff --git a/packages/use-shader-fx/package.json b/packages/use-shader-fx/package.json index 8df49073..e25f0ee2 100644 --- a/packages/use-shader-fx/package.json +++ b/packages/use-shader-fx/package.json @@ -37,10 +37,10 @@ "@types/node": "20.5.6", "@types/react": "18.2.21", "@types/react-dom": "18.2.7", - "@types/three": "^0.155.1", + "@types/three": "^0.164.0", "eslint": "8.47.0", "raw-loader": "^4.0.2", - "typescript": "5.2.2", + "typescript": "^5.2.2", "vite": "^4.5.0", "vite-plugin-glsl": "^1.1.2" }, diff --git a/packages/use-shader-fx/types/fxs/3D/types/index.d.ts b/packages/use-shader-fx/types/fxs/3D/types/index.d.ts deleted file mode 100644 index 1af2ca28..00000000 --- a/packages/use-shader-fx/types/fxs/3D/types/index.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import * as THREE from "three"; -import { HooksProps, MaterialProps } from "../../types"; -export interface HooksProps3D extends HooksProps { - /** For 3D series, you should use the r3f camera as it is as the camera passed to renderTarget. */ - camera: THREE.Camera; -} -export interface Create3DHooksProps extends MaterialProps { - /** You can put the r3f scene in, or if you don't want to add to any scene, you can pass nothing and it will just return the object without putting it in the scene, default : `false` */ - scene?: THREE.Scene | false; -} diff --git a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/index.d.ts b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/index.d.ts deleted file mode 100644 index 06f23ec3..00000000 --- a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/index.d.ts +++ /dev/null @@ -1,66 +0,0 @@ -import * as THREE from "three"; -import { HooksReturn } from "../../types"; -import { UseCreateMorphParticlesProps } from "./useCreateMorphParticles"; -import { HooksProps3D } from "../types"; -import { InteractiveMesh, MorphParticlePoints } from "./utils/useCreateObject"; -import { CustomParams } from "../../../utils/setUniforms"; -export type MorphParticlesParams = { - /** progress value to morph vertices,0~1 */ - morphProgress?: number; - blurAlpha?: number; - blurRadius?: number; - pointSize?: number; - /** default : `1` */ - pointAlpha?: number; - /** Since the color is extracted based on the attribute `uv`, the intended behavior will not occur if there is no uv in the attribute. */ - picture?: THREE.Texture | false; - /** The alpha map is a grayscale texture that controls the opacity across the surface (black: fully transparent; white: fully opaque). use the green channel when sampling this texture. It also affects the size of the point. default : `false` */ - alphaPicture?: THREE.Texture | false; - color0?: THREE.Color; - color1?: THREE.Color; - color2?: THREE.Color; - color3?: THREE.Color; - /** This maps to point,texture */ - map?: THREE.Texture | false; - /** The alpha map is a grayscale texture that controls the opacity across the surface (black: fully transparent; white: fully opaque). use the green channel when sampling this texture. default : `false` */ - alphaMap?: THREE.Texture | false; - /** If ​​wobbleStrength is set to 0, wobble will stop. It will also affect noise calculation, default : `0` */ - wobbleStrength?: number; - wobblePositionFrequency?: number; - wobbleTimeFrequency?: number; - /** default : `0` */ - warpStrength?: number; - warpPositionFrequency?: number; - warpTimeFrequency?: number; - /** Manipulate the vertices using the color channels of this texture. The strength of the displacement changes depending on the g channel of this texture */ - displacement?: THREE.Texture | false; - /** Strength of displacement. The strength of displacement depends on g ch, but is the value multiplied by it , default : `1` */ - displacementIntensity?: number; - /** Strength to reflect color ch of displacement texture */ - displacementColorIntensity?: number; - /** If set to 0, noise calculation stops, default : `0` */ - sizeRandomIntensity?: number; - sizeRandomTimeFrequency?: number; - sizeRandomMin?: number; - sizeRandomMax?: number; - /** Divergence rate of a point. Negative cases are dense, positive cases are divergent, default : `0` */ - divergence?: number; - /** Divergence centre point, default : `THREE.Vector3(0)` */ - divergencePoint?: THREE.Vector3; - /** you can get into the rhythm ♪ , default : `false` */ - beat?: number | false; -}; -export type MorphParticlesObject = { - scene: THREE.Scene; - points: MorphParticlePoints; - interactiveMesh: InteractiveMesh; - renderTarget: THREE.WebGLRenderTarget; - output: THREE.Texture; - positions: Float32Array[]; - uvs: Float32Array[]; -}; -export declare const MORPHPARTICLES_PARAMS: MorphParticlesParams; -/** - * @link https://github.com/FunTechInc/use-shader-fx - */ -export declare const useMorphParticles: ({ size, dpr, samples, isSizeUpdate, camera, geometry, positions, uvs, uniforms, onBeforeCompile, }: HooksProps3D & UseCreateMorphParticlesProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/useCreateMorphParticles.d.ts b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/useCreateMorphParticles.d.ts deleted file mode 100644 index 4bdce8c4..00000000 --- a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/useCreateMorphParticles.d.ts +++ /dev/null @@ -1,29 +0,0 @@ -import * as THREE from "three"; -import { Size, RootState } from "@react-three/fiber"; -import { InteractiveMesh, MorphParticlePoints } from "./utils/useCreateObject"; -import { MorphParticlesParams } from "."; -import { CustomParams } from "../../../utils/setUniforms"; -import { Create3DHooksProps } from "../types"; -import { Dpr } from "../../types"; -export type UseCreateMorphParticlesProps = { - size: Size; - dpr: Dpr; - /** default : `THREE.SphereGeometry(1, 32, 32)` */ - geometry?: THREE.BufferGeometry; - positions?: Float32Array[]; - uvs?: Float32Array[]; - /** Array of textures to map to points. Mapped at random. */ - mapArray?: THREE.Texture[]; -}; -type UpdateUniform = (rootState: RootState | null, newParams?: MorphParticlesParams, customParams?: CustomParams) => void; -type UseCreateMorphParticlesReturn = [ - UpdateUniform, - { - points: MorphParticlePoints; - interactiveMesh: InteractiveMesh; - positions: Float32Array[]; - uvs: Float32Array[]; - } -]; -export declare const useCreateMorphParticles: ({ size, dpr, scene, geometry, positions, uvs, mapArray, uniforms, onBeforeCompile, }: Create3DHooksProps & UseCreateMorphParticlesProps) => UseCreateMorphParticlesReturn; -export {}; diff --git a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/modifyAttributes.d.ts b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/modifyAttributes.d.ts deleted file mode 100644 index 241902bc..00000000 --- a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/modifyAttributes.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import * as THREE from "three"; -/** - * 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 - * */ -export declare const modifyAttributes: (attribute: Float32Array[] | undefined, targetGeometry: THREE.BufferGeometry, targetAttibute: "position" | "uv", itemSize: number) => Float32Array[]; diff --git a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/rewriteFragmentShader.d.ts b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/rewriteFragmentShader.d.ts deleted file mode 100644 index c46d824e..00000000 --- a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/rewriteFragmentShader.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import * as THREE from "three"; -export declare const rewriteFragmentShader: (mapArray: THREE.Texture[] | undefined, fragmentShader: string) => { - rewritedFragmentShader: string; - mapArrayUniforms: any; -}; diff --git a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/rewriteVertexShader.d.ts b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/rewriteVertexShader.d.ts deleted file mode 100644 index 90866e6c..00000000 --- a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/rewriteVertexShader.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -import * as THREE from "three"; -export declare const rewriteVertexShader: (modifeidAttributes: Float32Array[], targetGeometry: THREE.BufferGeometry, targetAttibute: "position" | "uv", vertexShader: string, itemSize: number) => string; diff --git a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/useCreateObject.d.ts b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/useCreateObject.d.ts deleted file mode 100644 index b3ff18d9..00000000 --- a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/useCreateObject.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import * as THREE from "three"; -type UseCreateObjectProps = { - scene: THREE.Scene | false; - geometry: THREE.BufferGeometry; - material: THREE.ShaderMaterial; -}; -export type MorphParticlePoints = THREE.Points, THREE.ShaderMaterial>; -export type InteractiveMesh = THREE.Mesh, THREE.ShaderMaterial>; -export declare const useCreateObject: ({ scene, geometry, material, }: UseCreateObjectProps) => { - points: MorphParticlePoints; - interactiveMesh: InteractiveMesh; -}; -export {}; diff --git a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/useMaterial.d.ts b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/useMaterial.d.ts deleted file mode 100644 index 95b48142..00000000 --- a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/useMaterial.d.ts +++ /dev/null @@ -1,124 +0,0 @@ -import * as THREE from "three"; -import { Size } from "@react-three/fiber"; -import { MaterialProps } from "../../../types"; -export declare class MorphParticlesMaterial extends THREE.ShaderMaterial { - uniforms: { - uResolution: { - value: THREE.Vector2; - }; - uMorphProgress: { - value: number; - }; - uBlurAlpha: { - value: number; - }; - uBlurRadius: { - value: number; - }; - uPointSize: { - value: number; - }; - uPointAlpha: { - value: number; - }; - uPicture: { - value: THREE.Texture; - }; - uIsPicture: { - value: boolean; - }; - uAlphaPicture: { - value: THREE.Texture; - }; - uIsAlphaPicture: { - value: boolean; - }; - uColor0: { - value: THREE.Color; - }; - uColor1: { - value: THREE.Color; - }; - uColor2: { - value: THREE.Color; - }; - uColor3: { - value: THREE.Color; - }; - uMap: { - value: THREE.Texture; - }; - uIsMap: { - value: boolean; - }; - uAlphaMap: { - value: THREE.Texture; - }; - uIsAlphaMap: { - value: boolean; - }; - uTime: { - value: number; - }; - uWobblePositionFrequency: { - value: number; - }; - uWobbleTimeFrequency: { - value: number; - }; - uWobbleStrength: { - value: number; - }; - uWarpPositionFrequency: { - value: number; - }; - uWarpTimeFrequency: { - value: number; - }; - uWarpStrength: { - value: number; - }; - uDisplacement: { - value: THREE.Texture; - }; - uIsDisplacement: { - value: boolean; - }; - uDisplacementIntensity: { - value: number; - }; - uDisplacementColorIntensity: { - value: number; - }; - uSizeRandomIntensity: { - value: number; - }; - uSizeRandomTimeFrequency: { - value: number; - }; - uSizeRandomMin: { - value: number; - }; - uSizeRandomMax: { - value: number; - }; - uDivergence: { - value: number; - }; - uDivergencePoint: { - value: THREE.Vector3; - }; - }; -} -export declare const useMaterial: ({ size, dpr, geometry, positions, uvs, mapArray, uniforms, onBeforeCompile, }: { - size: Size; - dpr: number | false; - geometry: THREE.BufferGeometry; - positions?: Float32Array[] | undefined; - uvs?: Float32Array[] | undefined; - mapArray?: THREE.Texture[] | undefined; -} & MaterialProps) => { - material: MorphParticlesMaterial; - modifiedPositions: Float32Array[]; - modifiedUvs: Float32Array[]; -}; diff --git a/packages/use-shader-fx/types/fxs/3D/useWobble3D/index.d.ts b/packages/use-shader-fx/types/fxs/3D/useWobble3D/index.d.ts deleted file mode 100644 index d8095058..00000000 --- a/packages/use-shader-fx/types/fxs/3D/useWobble3D/index.d.ts +++ /dev/null @@ -1,56 +0,0 @@ -import * as THREE from "three"; -import { HooksReturn } from "../../types"; -import { UseCreateWobble3DProps } from "./useCreateWobble3D"; -import { WobbleMaterialProps, WobbleMaterialConstructor } from "./useMaterial"; -import { HooksProps3D } from "../types"; -import { CustomParams } from "../../../utils/setUniforms"; -export type Wobble3DParams = { - /** default : `0.3` */ - wobbleStrength?: number; - /** default : `0.3` */ - wobblePositionFrequency?: number; - /** default : `0.3` */ - wobbleTimeFrequency?: number; - /** default : `0.3` */ - warpStrength?: number; - /** default : `0.3` */ - warpPositionFrequency?: number; - /** default : `0.3` */ - warpTimeFrequency?: number; - color0?: THREE.Color; - color1?: THREE.Color; - color2?: THREE.Color; - color3?: THREE.Color; - /** Mixing ratio with the material's original output color, 0~1 , defaulat : `1` */ - colorMix?: number; - /** Threshold of edge. 0 for edge disabled, default : `0` */ - edgeThreshold?: number; - /** Color of edge. default : `0x000000` */ - edgeColor?: THREE.Color; - /** you can get into the rhythm ♪ , default : `false` */ - beat?: number | false; - /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.1` */ - chromaticAberration?: number; - /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.1` */ - anisotropicBlur?: number; - /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.0` */ - distortion?: number; - /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.1` */ - distortionScale?: number; - /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.0` */ - temporalDistortion?: number; - /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `6` */ - refractionSamples?: number; -}; -export type Wobble3DObject = { - scene: THREE.Scene; - mesh: THREE.Mesh; - depthMaterial: THREE.MeshDepthMaterial; - renderTarget: THREE.WebGLRenderTarget; - output: THREE.Texture; -}; -export declare const WOBBLE3D_PARAMS: Wobble3DParams; -/** - * @link https://github.com/FunTechInc/use-shader-fx - */ -export declare const useWobble3D: ({ size, dpr, samples, isSizeUpdate, camera, geometry, baseMaterial, materialParameters, uniforms, onBeforeCompile, depthOnBeforeCompile, isCustomTransmission, }: HooksProps3D & UseCreateWobble3DProps & WobbleMaterialProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/3D/useWobble3D/useCreateWobble3D.d.ts b/packages/use-shader-fx/types/fxs/3D/useWobble3D/useCreateWobble3D.d.ts deleted file mode 100644 index 532af3e2..00000000 --- a/packages/use-shader-fx/types/fxs/3D/useWobble3D/useCreateWobble3D.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -import * as THREE from "three"; -import { RootState } from "@react-three/fiber"; -import { WobbleMaterialProps, WobbleMaterialConstructor } from "./useMaterial"; -import { Wobble3DParams } from "."; -import { CustomParams } from "../../../utils/setUniforms"; -import { Create3DHooksProps } from "../types"; -export type UseCreateWobble3DProps = { - /** default : `THREE.IcosahedronGeometry(2,20)` */ - geometry?: THREE.BufferGeometry; -}; -type UpdateUniform = (rootState: RootState | null, newParams?: Wobble3DParams, customParams?: CustomParams) => void; -type UseCreateWobble3DReturn = [ - UpdateUniform, - { - mesh: THREE.Mesh; - depthMaterial: THREE.MeshDepthMaterial; - } -]; -export declare const useCreateWobble3D: ({ scene, geometry, isCustomTransmission, baseMaterial, materialParameters, onBeforeCompile, depthOnBeforeCompile, uniforms, }: UseCreateWobble3DProps & Create3DHooksProps & WobbleMaterialProps) => UseCreateWobble3DReturn; -export {}; diff --git a/packages/use-shader-fx/types/fxs/3D/useWobble3D/useMaterial.d.ts b/packages/use-shader-fx/types/fxs/3D/useWobble3D/useMaterial.d.ts deleted file mode 100644 index ebe6a913..00000000 --- a/packages/use-shader-fx/types/fxs/3D/useWobble3D/useMaterial.d.ts +++ /dev/null @@ -1,91 +0,0 @@ -import * as THREE from "three"; -import { MaterialProps } from "../../types"; -export declare class Wobble3DMaterial extends THREE.Material { - uniforms: { - uTime: { - value: number; - }; - uWobblePositionFrequency: { - value: number; - }; - uWobbleTimeFrequency: { - value: number; - }; - uWobbleStrength: { - value: number; - }; - uWarpPositionFrequency: { - value: number; - }; - uWarpTimeFrequency: { - value: number; - }; - uWarpStrength: { - value: number; - }; - uColor0: { - value: THREE.Color; - }; - uColor1: { - value: THREE.Color; - }; - uColor2: { - value: THREE.Color; - }; - uColor3: { - value: THREE.Color; - }; - uColorMix: { - value: number; - }; - uEdgeThreshold: { - value: number; - }; - uEdgeColor: { - value: THREE.Color; - }; - uChromaticAberration: { - value: number; - }; - uAnisotropicBlur: { - value: number; - }; - uDistortion: { - value: number; - }; - uDistortionScale: { - value: number; - }; - uTemporalDistortion: { - value: number; - }; - uRefractionSamples: { - value: number; - }; - }; -} -export type WobbleMaterialConstructor = new (opts: { - [key: string]: any; -}) => THREE.Material; -type WobbleMaterialParams = ConstructorParameters[0]; -export interface WobbleMaterialProps extends MaterialProps { - /** default:THREE.MeshPhysicalMaterial */ - baseMaterial?: T; - materialParameters?: WobbleMaterialParams; - /** - * An optional callback that is executed immediately before the depth shader program is compiled. - * @param shader — Source code of the shader - * @param renderer — WebGLRenderer Context that is initializing the material - */ - depthOnBeforeCompile?: (shader: THREE.Shader, renderer: THREE.WebGLRenderer) => void; - /** - * Whether to apply more advanced `transmission` or not. valid only for `MeshPhysicalMaterial`. This is a function referring to `drei/MeshTransmissionMaterial`, default : `false` - * @link https://github.com/pmndrs/drei?tab=readme-ov-file#meshtransmissionmaterial - * */ - isCustomTransmission?: boolean; -} -export declare const useMaterial: ({ baseMaterial, materialParameters, onBeforeCompile, depthOnBeforeCompile, isCustomTransmission, uniforms, }: WobbleMaterialProps) => { - material: Wobble3DMaterial; - depthMaterial: THREE.MeshDepthMaterial; -}; -export {}; 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 deleted file mode 100644 index b85221c1..00000000 --- a/packages/use-shader-fx/types/fxs/effects/useMotionBlur/index.d.ts +++ /dev/null @@ -1,27 +0,0 @@ -import * as THREE from "three"; -import { DoubleRenderTarget } from "../../../utils/useDoubleFBO"; -import { CustomParams } from "../../../utils/setUniforms"; -import type { HooksProps, HooksReturn } from "../../types"; -export type MotionBlurParams = { - /** Make this texture blur, default : `THREE.Texture()` */ - texture?: THREE.Texture; - /** motion begin, default : `THREE.Vector2(0, 0)` */ - begin?: THREE.Vector2; - /** motion end, default : `THREE.Vector2(0, 0)` */ - end?: THREE.Vector2; - /** motion strength, default : `0.9` */ - strength?: number; -}; -export type MotionBlurObject = { - scene: THREE.Scene; - mesh: THREE.Mesh; - material: THREE.Material; - camera: THREE.Camera; - renderTarget: DoubleRenderTarget; - output: THREE.Texture; -}; -export declare const MOTIONBLUR_PARAMS: MotionBlurParams; -/** - * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage - */ -export declare const useMotionBlur: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/effects/useMotionBlur/useMesh.d.ts b/packages/use-shader-fx/types/fxs/effects/useMotionBlur/useMesh.d.ts deleted file mode 100644 index 2247b0de..00000000 --- a/packages/use-shader-fx/types/fxs/effects/useMotionBlur/useMesh.d.ts +++ /dev/null @@ -1,27 +0,0 @@ -import * as THREE from "three"; -import { MaterialProps } from "../../types"; -export declare class MotionBlurMaterial extends THREE.ShaderMaterial { - uniforms: { - uTexture: { - value: THREE.Texture; - }; - uBackbuffer: { - value: THREE.Texture; - }; - uBegin: { - value: THREE.Vector2; - }; - uEnd: { - value: THREE.Vector2; - }; - uStrength: { - value: number; - }; - }; -} -export declare const useMesh: ({ scene, uniforms, onBeforeCompile, }: { - scene: THREE.Scene; -} & MaterialProps) => { - material: MotionBlurMaterial; - mesh: THREE.Mesh, MotionBlurMaterial>; -}; diff --git a/packages/use-shader-fx/types/fxs/effects/useSimpleBlur/index.d.ts b/packages/use-shader-fx/types/fxs/effects/useSimpleBlur/index.d.ts deleted file mode 100644 index c4b92431..00000000 --- a/packages/use-shader-fx/types/fxs/effects/useSimpleBlur/index.d.ts +++ /dev/null @@ -1,25 +0,0 @@ -import * as THREE from "three"; -import { DoubleRenderTarget } from "../../../utils/useDoubleFBO"; -import { CustomParams } from "../../../utils/setUniforms"; -import type { HooksProps, HooksReturn } from "../../types"; -export type SimpleBlurParams = { - /** Make this texture blur , default : `THREE.Texture()` */ - texture?: THREE.Texture; - /** blurSize, default : `3` */ - blurSize?: number; - /** blurPower, affects performance default : `5` */ - blurPower?: number; -}; -export type SimpleBlurObject = { - scene: THREE.Scene; - mesh: THREE.Mesh; - material: THREE.Material; - camera: THREE.Camera; - renderTarget: DoubleRenderTarget; - output: THREE.Texture; -}; -export declare const SIMPLEBLUR_PARAMS: SimpleBlurParams; -/** - * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage - */ -export declare const useSimpleBlur: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/effects/useSimpleBlur/useMesh.d.ts b/packages/use-shader-fx/types/fxs/effects/useSimpleBlur/useMesh.d.ts deleted file mode 100644 index c7421ab0..00000000 --- a/packages/use-shader-fx/types/fxs/effects/useSimpleBlur/useMesh.d.ts +++ /dev/null @@ -1,21 +0,0 @@ -import * as THREE from "three"; -import { MaterialProps } from "../../types"; -export declare class SampleMaterial extends THREE.ShaderMaterial { - uniforms: { - uTexture: { - value: THREE.Texture; - }; - uResolution: { - value: THREE.Vector2; - }; - uBlurSize: { - value: number; - }; - }; -} -export declare const useMesh: ({ scene, uniforms, onBeforeCompile, }: { - scene: THREE.Scene; -} & MaterialProps) => { - material: SampleMaterial; - mesh: THREE.Mesh, SampleMaterial>; -}; diff --git a/packages/use-shader-fx/types/fxs/effects/useWave/index.d.ts b/packages/use-shader-fx/types/fxs/effects/useWave/index.d.ts deleted file mode 100644 index 13591fff..00000000 --- a/packages/use-shader-fx/types/fxs/effects/useWave/index.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -import * as THREE from "three"; -import { CustomParams } from "../../../utils/setUniforms"; -import { HooksProps, HooksReturn } from "../../types"; -export type WaveParams = { - /** -1.0 ~ 1.0 , default : `vec2(0.0,0.0)` */ - epicenter?: THREE.Vector2; - /** 0.0 ~ 1.0 , default : `0.0` */ - progress?: number; - /** default : `0.0` */ - width?: number; - /** default : `0.0` */ - strength?: number; - /** default : `center` */ - mode?: "center" | "horizontal" | "vertical"; -}; -export type WaveObject = { - scene: THREE.Scene; - mesh: THREE.Mesh; - material: THREE.Material; - camera: THREE.Camera; - renderTarget: THREE.WebGLRenderTarget; - output: THREE.Texture; -}; -export declare const WAVE_PARAMS: WaveParams; -/** - * @link https://github.com/FunTechInc/use-shader-fx - */ -export declare const useWave: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/effects/useWave/useMesh.d.ts b/packages/use-shader-fx/types/fxs/effects/useWave/useMesh.d.ts deleted file mode 100644 index 3fffdb45..00000000 --- a/packages/use-shader-fx/types/fxs/effects/useWave/useMesh.d.ts +++ /dev/null @@ -1,27 +0,0 @@ -import * as THREE from "three"; -import { MaterialProps } from "../../types"; -export declare class WaveMaterial extends THREE.ShaderMaterial { - uniforms: { - uEpicenter: { - value: THREE.Vector2; - }; - uProgress: { - value: number; - }; - uStrength: { - value: number; - }; - uWidth: { - value: number; - }; - uMode: { - value: number; - }; - }; -} -export declare const useMesh: ({ scene, uniforms, onBeforeCompile, }: { - scene: THREE.Scene; -} & MaterialProps) => { - material: WaveMaterial; - mesh: THREE.Mesh, WaveMaterial>; -}; diff --git a/packages/use-shader-fx/types/fxs/interactions/useBrush/index.d.ts b/packages/use-shader-fx/types/fxs/interactions/useBrush/index.d.ts deleted file mode 100644 index 47e9efd9..00000000 --- a/packages/use-shader-fx/types/fxs/interactions/useBrush/index.d.ts +++ /dev/null @@ -1,44 +0,0 @@ -import * as THREE from "three"; -import { PointerValues } from "../../../misc/usePointer"; -import { CustomParams } from "../../../utils/setUniforms"; -import { HooksProps, HooksReturn } from "../../types"; -import { DoubleRenderTarget } from "../../../utils/useDoubleFBO"; -export type BrushParams = { - /** Texture applied to the brush, If texture is true, it will take precedence over color , default : `false` */ - texture?: THREE.Texture | false; - /** You can attach an fx map , default : `false` */ - map?: THREE.Texture | false; - /** map intensity , default : `0.1` */ - mapIntensity?: number; - /** size of the stamp, percentage of the size ,default : `0.05` */ - radius?: number; - /** Strength of smudge effect , default : `0.0`*/ - smudge?: number; - /** dissipation rate. If set to 1, it will remain. , default : `1.0` */ - dissipation?: number; - /** Strength of motion blur , default : `0.0` */ - motionBlur?: number; - /** Number of motion blur samples. Affects performance default : `5` */ - motionSample?: number; - /** 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)` */ - color?: ((velocity: THREE.Vector2) => THREE.Vector3) | THREE.Vector3 | THREE.Color; - /** Follows the cursor even if it loses speed , default : `false` */ - isCursor?: boolean; - /** brush pressure (0 to 1) , default : `1.0` */ - pressure?: number; - /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */ - pointerValues?: PointerValues | false; -}; -export type BrushObject = { - scene: THREE.Scene; - mesh: THREE.Mesh; - material: THREE.Material; - camera: THREE.Camera; - renderTarget: DoubleRenderTarget; - output: THREE.Texture; -}; -export declare const BRUSH_PARAMS: BrushParams; -/** - * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage - */ -export declare const useBrush: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/interactions/useBrush/useMesh.d.ts b/packages/use-shader-fx/types/fxs/interactions/useBrush/useMesh.d.ts deleted file mode 100644 index 5fa3511a..00000000 --- a/packages/use-shader-fx/types/fxs/interactions/useBrush/useMesh.d.ts +++ /dev/null @@ -1,72 +0,0 @@ -import * as THREE from "three"; -import { Size } from "@react-three/fiber"; -import { MaterialProps } from "../../types"; -export declare class BrushMaterial extends THREE.ShaderMaterial { - uniforms: { - uBuffer: { - value: THREE.Texture; - }; - uTexture: { - value: THREE.Texture; - }; - uIsTexture: { - value: boolean; - }; - uMap: { - value: THREE.Texture; - }; - uIsMap: { - value: boolean; - }; - uMapIntensity: { - value: number; - }; - uResolution: { - value: THREE.Vector2; - }; - uRadius: { - value: number; - }; - uSmudge: { - value: number; - }; - uDissipation: { - value: number; - }; - uMotionBlur: { - value: number; - }; - uMotionSample: { - value: number; - }; - uMouse: { - value: number; - }; - uPrevMouse: { - value: number; - }; - uVelocity: { - value: number; - }; - uColor: { - value: THREE.Vector3 | THREE.Color; - }; - uIsCursor: { - value: boolean; - }; - uPressureStart: { - value: number; - }; - uPressureEnd: { - value: number; - }; - }; -} -export declare const useMesh: ({ scene, size, dpr, uniforms, onBeforeCompile, }: { - scene: THREE.Scene; - size: Size; - dpr: number | false; -} & MaterialProps) => { - material: BrushMaterial; - mesh: THREE.Mesh, BrushMaterial>; -}; diff --git a/packages/use-shader-fx/types/fxs/misc/useBlank/index.d.ts b/packages/use-shader-fx/types/fxs/misc/useBlank/index.d.ts deleted file mode 100644 index 4b65d645..00000000 --- a/packages/use-shader-fx/types/fxs/misc/useBlank/index.d.ts +++ /dev/null @@ -1,30 +0,0 @@ -import * as THREE from "three"; -import { BlankMaterial } from "./useMesh"; -import { DoubleRenderTarget } from "../../../utils/useDoubleFBO"; -import { CustomParams } from "../../../utils/setUniforms"; -import type { HooksProps, HooksReturn } from "../../types"; -export type BlankParams = { - /** texture, default : `THREE.Texture()` */ - texture?: THREE.Texture; - /** you can get into the rhythm ♪ , default : `false` */ - beat?: number | false; -}; -export type BlankObject = { - scene: THREE.Scene; - mesh: THREE.Mesh, BlankMaterial>; - material: BlankMaterial; - camera: THREE.Camera; - renderTarget: DoubleRenderTarget; - output: THREE.Texture; -}; -export declare const BLANK_PARAMS: BlankParams; -/** - * By default, it is a blank canvas with nothing drawn on it. You can customise the shaders using `onBeforeCompile`. - * Fragment shaders have `uTexture`,`uBackbuffer`,`uTime`,`uPointer` and `uResolution` as default uniforms. - * - * ※ `usf_FragColor` overrides `gl_FragColor` - * - * ※ `usf_Position` overrides `gl_Position` - * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage - */ -export declare const useBlank: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/misc/useBlank/useMesh.d.ts b/packages/use-shader-fx/types/fxs/misc/useBlank/useMesh.d.ts deleted file mode 100644 index 28563fc5..00000000 --- a/packages/use-shader-fx/types/fxs/misc/useBlank/useMesh.d.ts +++ /dev/null @@ -1,30 +0,0 @@ -import * as THREE from "three"; -import { MaterialProps } from "../../types"; -import { Size } from "@react-three/fiber"; -export declare class BlankMaterial extends THREE.ShaderMaterial { - uniforms: { - uTexture: { - value: THREE.Texture; - }; - uBackbuffer: { - value: THREE.Texture; - }; - uTime: { - value: number; - }; - uPointer: { - value: THREE.Vector2; - }; - uResolution: { - value: THREE.Vector2; - }; - }; -} -export declare const useMesh: ({ scene, size, dpr, uniforms, onBeforeCompile, }: { - scene: THREE.Scene; - size: Size; - dpr: number | false; -} & MaterialProps) => { - material: BlankMaterial; - mesh: THREE.Mesh, BlankMaterial>; -}; diff --git a/packages/use-shader-fx/types/fxs/misc/useChromaKey/index.d.ts b/packages/use-shader-fx/types/fxs/misc/useChromaKey/index.d.ts deleted file mode 100644 index f405e357..00000000 --- a/packages/use-shader-fx/types/fxs/misc/useChromaKey/index.d.ts +++ /dev/null @@ -1,36 +0,0 @@ -import * as THREE from "three"; -import { CustomParams } from "../../../utils/setUniforms"; -import { HooksProps, HooksReturn } from "../../types"; -export type ChromaKeyParams = { - /** Process this texture with chroma key , default : `THREE.Texture` */ - texture?: THREE.Texture; - /** key color for chromakey processing , default: `THREE.Color(0x00ff00)` */ - keyColor?: THREE.Color; - /** If the similarity with the key color exceeds this value, it becomes transparent. , default : `0.2` */ - similarity?: number; - /** smoothness , default : `0.1` */ - smoothness?: number; - /** spill , default : `0.2` */ - spill?: number; - /** tone correction , default : `THREE.Vector4(1.0, 1.0, 1.0, 1.0)` */ - color?: THREE.Vector4; - /** contrast , default : `1.0` */ - contrast?: number; - /** brightness , default : `0.0` */ - brightness?: number; - /** gamma correction , default : `1.0` */ - gamma?: number; -}; -export type ChromaKeyObject = { - scene: THREE.Scene; - mesh: THREE.Mesh; - material: THREE.Material; - camera: THREE.Camera; - renderTarget: THREE.WebGLRenderTarget; - output: THREE.Texture; -}; -export declare const CHROMAKEY_PARAMS: ChromaKeyParams; -/** - * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage - */ -export declare const useChromaKey: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/misc/useChromaKey/useMesh.d.ts b/packages/use-shader-fx/types/fxs/misc/useChromaKey/useMesh.d.ts deleted file mode 100644 index 1588a0aa..00000000 --- a/packages/use-shader-fx/types/fxs/misc/useChromaKey/useMesh.d.ts +++ /dev/null @@ -1,45 +0,0 @@ -import * as THREE from "three"; -import { Size } from "@react-three/fiber"; -import { MaterialProps } from "../../types"; -export declare class ChromaKeyMaterial extends THREE.ShaderMaterial { - uniforms: { - u_texture: { - value: THREE.Texture; - }; - u_resolution: { - value: THREE.Vector2; - }; - u_keyColor: { - value: THREE.Color; - }; - u_similarity: { - value: number; - }; - u_smoothness: { - value: number; - }; - u_spill: { - value: number; - }; - u_color: { - value: THREE.Vector4; - }; - u_contrast: { - value: number; - }; - u_brightness: { - value: number; - }; - u_gamma: { - value: number; - }; - }; -} -export declare const useMesh: ({ scene, size, dpr, uniforms, onBeforeCompile, }: { - scene: THREE.Scene; - size: Size; - dpr: number | false; -} & MaterialProps) => { - material: ChromaKeyMaterial; - mesh: THREE.Mesh, ChromaKeyMaterial>; -}; diff --git a/packages/use-shader-fx/types/fxs/noises/useColorStrata/index.d.ts b/packages/use-shader-fx/types/fxs/noises/useColorStrata/index.d.ts deleted file mode 100644 index e2e9c6c5..00000000 --- a/packages/use-shader-fx/types/fxs/noises/useColorStrata/index.d.ts +++ /dev/null @@ -1,40 +0,0 @@ -import * as THREE from "three"; -import { CustomParams } from "../../../utils/setUniforms"; -import { HooksProps, HooksReturn } from "../../types"; -export type ColorStrataParams = { - /** default : `null` */ - texture?: THREE.Texture | false; - /** Valid when texture is false. default : `1` */ - scale?: number; - /** default : `1.0` */ - laminateLayer?: number; - /** default : `(0.1, 0.1)` */ - laminateInterval?: THREE.Vector2; - /** default : `(1.0, 1.0)` */ - laminateDetail?: THREE.Vector2; - /** default : `(0.0, 0.0)` */ - distortion?: THREE.Vector2; - /** default : `(1.0, 1.0, 1.0)` */ - colorFactor?: THREE.Vector3; - /** default : `(0.0, 0.0)` */ - timeStrength?: THREE.Vector2; - /** default : `false` */ - noise?: THREE.Texture | false; - /** default : `(0.0,0.0)` */ - noiseStrength?: THREE.Vector2; - /** you can get into the rhythm ♪ , default : `false` */ - beat?: number | false; -}; -export type ColorStrataObject = { - scene: THREE.Scene; - mesh: THREE.Mesh; - material: THREE.Material; - camera: THREE.Camera; - renderTarget: THREE.WebGLRenderTarget; - output: THREE.Texture; -}; -export declare const COLORSTRATA_PARAMS: ColorStrataParams; -/** - * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage - */ -export declare const useColorStrata: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/noises/useColorStrata/useMesh.d.ts b/packages/use-shader-fx/types/fxs/noises/useColorStrata/useMesh.d.ts deleted file mode 100644 index c6050be3..00000000 --- a/packages/use-shader-fx/types/fxs/noises/useColorStrata/useMesh.d.ts +++ /dev/null @@ -1,51 +0,0 @@ -import * as THREE from "three"; -import { MaterialProps } from "../../types"; -export declare class ColorStrataMaterial extends THREE.ShaderMaterial { - uniforms: { - uTexture: { - value: THREE.Texture; - }; - isTexture: { - value: boolean; - }; - scale: { - value: number; - }; - noise: { - value: THREE.Texture; - }; - noiseStrength: { - value: THREE.Vector2; - }; - isNoise: { - value: boolean; - }; - laminateLayer: { - value: number; - }; - laminateInterval: { - value: THREE.Vector2; - }; - laminateDetail: { - value: THREE.Vector2; - }; - distortion: { - value: THREE.Vector2; - }; - colorFactor: { - value: THREE.Vector3; - }; - uTime: { - value: number; - }; - timeStrength: { - value: THREE.Vector2; - }; - }; -} -export declare const useMesh: ({ scene, uniforms, onBeforeCompile, }: { - scene: THREE.Scene; -} & MaterialProps) => { - material: ColorStrataMaterial; - mesh: THREE.Mesh, ColorStrataMaterial>; -}; diff --git a/packages/use-shader-fx/types/fxs/noises/useCosPalette/index.d.ts b/packages/use-shader-fx/types/fxs/noises/useCosPalette/index.d.ts deleted file mode 100644 index 915af6d6..00000000 --- a/packages/use-shader-fx/types/fxs/noises/useCosPalette/index.d.ts +++ /dev/null @@ -1,30 +0,0 @@ -import * as THREE from "three"; -import { CustomParams } from "../../../utils/setUniforms"; -import { HooksProps, HooksReturn } from "../../types"; -export type CosPaletteParams = { - /** color1, default : `rgb(50%, 50%, 50%)` */ - color1?: THREE.Color; - /** color2, default : `rgb(50%, 50%, 50%)` */ - color2?: THREE.Color; - /** color3, default : `rgb(100%, 100%, 100%)` */ - color3?: THREE.Color; - /** color4, default : `rgb(0%, 10%, 20%)` */ - color4?: THREE.Color; - /** texture to be used as a palette */ - texture?: THREE.Texture; - /** weight of the rgb, default : `THREE.Vector3(1.0,0.0,0.0)` */ - rgbWeight?: THREE.Vector3; -}; -export type ColorPaletteObject = { - scene: THREE.Scene; - mesh: THREE.Mesh; - material: THREE.Material; - camera: THREE.Camera; - renderTarget: THREE.WebGLRenderTarget; - output: THREE.Texture; -}; -export declare const COSPALETTE_PARAMS: CosPaletteParams; -/** - * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage - */ -export declare const useCosPalette: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/noises/useCosPalette/useMesh.d.ts b/packages/use-shader-fx/types/fxs/noises/useCosPalette/useMesh.d.ts deleted file mode 100644 index b145ff1d..00000000 --- a/packages/use-shader-fx/types/fxs/noises/useCosPalette/useMesh.d.ts +++ /dev/null @@ -1,30 +0,0 @@ -import * as THREE from "three"; -import { MaterialProps } from "../../types"; -export declare class CosPaletteMaterial extends THREE.ShaderMaterial { - uniforms: { - uTexture: { - value: THREE.Texture; - }; - uRgbWeight: { - value: THREE.Vector3; - }; - uColor1: { - value: THREE.Color; - }; - uColor2: { - value: THREE.Color; - }; - uColor3: { - value: THREE.Color; - }; - uColor4: { - value: THREE.Color; - }; - }; -} -export declare const useMesh: ({ scene, uniforms, onBeforeCompile, }: { - scene: THREE.Scene; -} & MaterialProps) => { - material: CosPaletteMaterial; - mesh: THREE.Mesh, CosPaletteMaterial>; -}; diff --git a/packages/use-shader-fx/types/fxs/noises/useMarble/index.d.ts b/packages/use-shader-fx/types/fxs/noises/useMarble/index.d.ts deleted file mode 100644 index 4992eaea..00000000 --- a/packages/use-shader-fx/types/fxs/noises/useMarble/index.d.ts +++ /dev/null @@ -1,32 +0,0 @@ -import * as THREE from "three"; -import { CustomParams } from "../../../utils/setUniforms"; -import { HooksProps, HooksReturn } from "../../types"; -export type MarbleParams = { - /** You can add random patterns to noise by passing random numbers ,default : `0` */ - pattern?: number; - /** default : `2` */ - complexity?: number; - /** default : `0.2` */ - complexityAttenuation?: number; - /** default : `8` */ - iterations?: number; - /** default : `0.2` */ - timeStrength?: number; - /** default : `0.002` */ - scale?: number; - /** you can get into the rhythm ♪ , default : `false` */ - beat?: number | false; -}; -export type MarbleObject = { - scene: THREE.Scene; - mesh: THREE.Mesh; - material: THREE.Material; - camera: THREE.Camera; - renderTarget: THREE.WebGLRenderTarget; - output: THREE.Texture; -}; -export declare const MARBLE_PARAMS: MarbleParams; -/** - * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage - */ -export declare const useMarble: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/noises/useMarble/useMesh.d.ts b/packages/use-shader-fx/types/fxs/noises/useMarble/useMesh.d.ts deleted file mode 100644 index dc3b48d9..00000000 --- a/packages/use-shader-fx/types/fxs/noises/useMarble/useMesh.d.ts +++ /dev/null @@ -1,33 +0,0 @@ -import * as THREE from "three"; -import { MaterialProps } from "../../types"; -export declare class MarbleMaterial extends THREE.ShaderMaterial { - uniforms: { - u_time: { - value: number; - }; - u_pattern: { - value: number; - }; - u_complexity: { - value: number; - }; - u_complexityAttenuation: { - value: number; - }; - u_iterations: { - value: number; - }; - u_timeStrength: { - value: number; - }; - u_scale: { - value: number; - }; - }; -} -export declare const useMesh: ({ scene, uniforms, onBeforeCompile, }: { - scene: THREE.Scene; -} & MaterialProps) => { - material: MarbleMaterial; - mesh: THREE.Mesh, MarbleMaterial>; -}; diff --git a/packages/use-shader-fx/types/fxs/noises/useNoise/index.d.ts b/packages/use-shader-fx/types/fxs/noises/useNoise/index.d.ts deleted file mode 100644 index 9f59ffbc..00000000 --- a/packages/use-shader-fx/types/fxs/noises/useNoise/index.d.ts +++ /dev/null @@ -1,36 +0,0 @@ -import * as THREE from "three"; -import { CustomParams } from "../../../utils/setUniforms"; -import { HooksProps, HooksReturn } from "../../types"; -export type NoiseParams = { - /** noise scale , default : `0.004` */ - scale?: number; - /** time factor default : `0.3` */ - timeStrength?: number; - /** noiseOctaves, affects performance default : `2` */ - noiseOctaves?: number; - /** fbmOctaves, affects performance default : `2` */ - fbmOctaves?: number; - /** domain warping octaves , affects performance default : `2` */ - warpOctaves?: number; - /** direction of domain warping , default : `(2.0,2,0)` */ - warpDirection?: THREE.Vector2; - /** strength of domain warping , default : `8.0` */ - warpStrength?: number; - /** you can get into the rhythm ♪ , default : `false` */ - beat?: number | false; -}; -export type NoiseObject = { - scene: THREE.Scene; - mesh: THREE.Mesh; - material: THREE.Material; - camera: THREE.Camera; - renderTarget: THREE.WebGLRenderTarget; - output: THREE.Texture; -}; -export declare const NOISE_PARAMS: NoiseParams; -/** - * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage - * - * It is a basic value noise with `fbm` and `domain warping` - */ -export declare const useNoise: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/noises/useNoise/useMesh.d.ts b/packages/use-shader-fx/types/fxs/noises/useNoise/useMesh.d.ts deleted file mode 100644 index 67a1fb7f..00000000 --- a/packages/use-shader-fx/types/fxs/noises/useNoise/useMesh.d.ts +++ /dev/null @@ -1,36 +0,0 @@ -import * as THREE from "three"; -import { MaterialProps } from "../../types"; -export declare class NoiseMaterial extends THREE.ShaderMaterial { - uniforms: { - uTime: { - value: number; - }; - scale: { - value: number; - }; - timeStrength: { - value: number; - }; - noiseOctaves: { - value: number; - }; - fbmOctaves: { - value: number; - }; - warpOctaves: { - value: number; - }; - warpDirection: { - value: THREE.Vector2; - }; - warpStrength: { - value: number; - }; - }; -} -export declare const useMesh: ({ scene, uniforms, onBeforeCompile, }: { - scene: THREE.Scene; -} & MaterialProps) => { - material: NoiseMaterial; - mesh: THREE.Mesh, NoiseMaterial>; -}; 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 deleted file mode 100644 index 913f01c2..00000000 --- a/packages/use-shader-fx/types/fxs/simulations/useFluid/index.d.ts +++ /dev/null @@ -1,59 +0,0 @@ -import * as THREE from "three"; -import { FluidMaterials, CustomFluidProps, CustomFluidParams } from "./useMesh"; -import { PointerValues } from "../../../misc/usePointer"; -import { HooksProps, HooksReturn } from "../../types"; -import { DoubleRenderTarget } from "../../../utils/useDoubleFBO"; -export declare const DELTA_TIME = 0.016; -export type FluidParams = { - /** density disspation , default : `0.98` */ - density_dissipation?: number; - /** velocity dissipation , default : `0.99` */ - velocity_dissipation?: number; - /** velocity acceleration , default : `10.0` */ - velocity_acceleration?: number; - /** pressure dissipation , default : `0.9` */ - pressure_dissipation?: number; - /** pressure iterations. affects performance , default : `20` */ - pressure_iterations?: number; - /** curl_strength , default : `35` */ - curl_strength?: number; - /** splat radius , default : `0.002` */ - splat_radius?: number; - /** 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)` */ - fluid_color?: ((velocity: THREE.Vector2) => THREE.Vector3) | THREE.Vector3 | THREE.Color; - /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */ - pointerValues?: PointerValues | false; -}; -export type FluidObject = { - scene: THREE.Scene; - mesh: THREE.Mesh; - materials: FluidMaterials; - camera: THREE.Camera; - renderTarget: { - velocity: DoubleRenderTarget; - density: DoubleRenderTarget; - curl: THREE.WebGLRenderTarget; - divergence: THREE.WebGLRenderTarget; - pressure: DoubleRenderTarget; - }; - output: THREE.Texture; -}; -export declare const FLUID_PARAMS: FluidParams; -/** - * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage - */ -export declare const useFluid: ({ size, dpr, samples, isSizeUpdate, customFluidProps, }: { - /** you can add `onBeforeComile` of the next material.`initial`,`curl`,`vorticity`,`advection`,`divergence`,`pressure`,`clear`,`gradientSubtract`,`splat` - * ```ts - * fluidOnBeforeCompile: { - vorticity: { - onBeforeCompile: (shader) => console.log(shader), - uniforms:{ - hoge: { value: 0.0 }, - } - }, - }, - * ``` - */ - customFluidProps?: CustomFluidProps | undefined; -} & HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useAdvectionMaterial.d.ts b/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useAdvectionMaterial.d.ts deleted file mode 100644 index 0305950b..00000000 --- a/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useAdvectionMaterial.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -import * as THREE from "three"; -import { MaterialProps } from "../../../types"; -export declare class AdvectionMaterial extends THREE.ShaderMaterial { - uniforms: { - uVelocity: { - value: THREE.Texture; - }; - uSource: { - value: THREE.Texture; - }; - texelSize: { - value: THREE.Vector2; - }; - dt: { - value: number; - }; - dissipation: { - value: number; - }; - }; -} -export declare const useAdvectionMaterial: ({ onBeforeCompile, uniforms, }: MaterialProps) => AdvectionMaterial; diff --git a/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useClearMaterial.d.ts b/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useClearMaterial.d.ts deleted file mode 100644 index d1f87aa0..00000000 --- a/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useClearMaterial.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import * as THREE from "three"; -import { MaterialProps } from "../../../types"; -export declare class ClearMaterial extends THREE.ShaderMaterial { - uniforms: { - uTexture: { - value: THREE.Texture; - }; - value: { - value: number; - }; - texelSize: { - value: THREE.Vector2; - }; - }; -} -export declare const useClearMaterial: ({ onBeforeCompile, uniforms, }: MaterialProps) => ClearMaterial; diff --git a/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useCurlMaterial.d.ts b/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useCurlMaterial.d.ts deleted file mode 100644 index f9e2dd85..00000000 --- a/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useCurlMaterial.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import * as THREE from "three"; -import { MaterialProps } from "../../../types"; -export declare class CurlMaterial extends THREE.ShaderMaterial { - uniforms: { - uVelocity: { - value: THREE.Texture; - }; - texelSize: { - value: THREE.Vector2; - }; - }; -} -export declare const useCurlMaterial: ({ onBeforeCompile, uniforms, }: MaterialProps) => CurlMaterial; diff --git a/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useDivergenceMaterial.d.ts b/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useDivergenceMaterial.d.ts deleted file mode 100644 index d9fc7cc6..00000000 --- a/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useDivergenceMaterial.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import * as THREE from "three"; -import { MaterialProps } from "../../../types"; -export declare class DivergenceMaterial extends THREE.ShaderMaterial { - uniforms: { - uVelocity: { - value: THREE.Texture; - }; - texelSize: { - value: THREE.Vector2; - }; - }; -} -export declare const useDivergenceMaterial: ({ onBeforeCompile, uniforms, }: MaterialProps) => DivergenceMaterial; diff --git a/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useGradientSubtractMaterial.d.ts b/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useGradientSubtractMaterial.d.ts deleted file mode 100644 index 49d42797..00000000 --- a/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useGradientSubtractMaterial.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import * as THREE from "three"; -import { MaterialProps } from "../../../types"; -export declare class GradientSubtractMaterial extends THREE.ShaderMaterial { - uniforms: { - uPressure: { - value: THREE.Texture; - }; - uVelocity: { - value: THREE.Texture; - }; - texelSize: { - value: THREE.Vector2; - }; - }; -} -export declare const useGradientSubtractMaterial: ({ onBeforeCompile, uniforms, }: MaterialProps) => GradientSubtractMaterial; diff --git a/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useInitialMaterial.d.ts b/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useInitialMaterial.d.ts deleted file mode 100644 index 6322827a..00000000 --- a/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useInitialMaterial.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -import * as THREE from "three"; -export declare const useInitialMaterial: () => THREE.ShaderMaterial; diff --git a/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/usePressureMaterial.d.ts b/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/usePressureMaterial.d.ts deleted file mode 100644 index 923a8b89..00000000 --- a/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/usePressureMaterial.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import * as THREE from "three"; -import { MaterialProps } from "../../../types"; -export declare class PressureMaterial extends THREE.ShaderMaterial { - uniforms: { - uPressure: { - value: THREE.Texture; - }; - uDivergence: { - value: THREE.Texture; - }; - texelSize: { - value: THREE.Vector2; - }; - }; -} -export declare const usePressureMaterial: ({ onBeforeCompile, uniforms, }: MaterialProps) => PressureMaterial; diff --git a/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useSplatMaterial.d.ts b/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useSplatMaterial.d.ts deleted file mode 100644 index cfea05f6..00000000 --- a/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useSplatMaterial.d.ts +++ /dev/null @@ -1,25 +0,0 @@ -import * as THREE from "three"; -import { MaterialProps } from "../../../types"; -export declare class SplatMaterial extends THREE.ShaderMaterial { - uniforms: { - uTarget: { - value: THREE.Texture; - }; - aspectRatio: { - value: number; - }; - color: { - value: THREE.Vector3 | THREE.Color; - }; - point: { - value: THREE.Vector2; - }; - radius: { - value: number; - }; - texelSize: { - value: THREE.Vector2; - }; - }; -} -export declare const useSplatMaterial: ({ onBeforeCompile, uniforms, }: MaterialProps) => SplatMaterial; diff --git a/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useVorticityMaterial.d.ts b/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useVorticityMaterial.d.ts deleted file mode 100644 index af3b80eb..00000000 --- a/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useVorticityMaterial.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -import * as THREE from "three"; -import { MaterialProps } from "../../../types"; -export declare class VorticityMaterial extends THREE.ShaderMaterial { - uniforms: { - uVelocity: { - value: THREE.Texture; - }; - uCurl: { - value: THREE.Texture; - }; - curl: { - value: number; - }; - dt: { - value: number; - }; - texelSize: { - value: THREE.Vector2; - }; - }; -} -export declare const useVorticityMaterial: ({ onBeforeCompile, uniforms, }: MaterialProps) => VorticityMaterial; diff --git a/packages/use-shader-fx/types/fxs/simulations/useFluid/useMesh.d.ts b/packages/use-shader-fx/types/fxs/simulations/useFluid/useMesh.d.ts deleted file mode 100644 index 6b13ff03..00000000 --- a/packages/use-shader-fx/types/fxs/simulations/useFluid/useMesh.d.ts +++ /dev/null @@ -1,53 +0,0 @@ -import * as THREE from "three"; -import { AdvectionMaterial } from "./materials/useAdvectionMaterial"; -import { DivergenceMaterial } from "./materials/useDivergenceMaterial"; -import { PressureMaterial } from "./materials/usePressureMaterial"; -import { CurlMaterial } from "./materials/useCurlMaterial"; -import { VorticityMaterial } from "./materials/useVorticityMaterial"; -import { ClearMaterial } from "./materials/useClearMaterial"; -import { GradientSubtractMaterial } from "./materials/useGradientSubtractMaterial"; -import { SplatMaterial } from "./materials/useSplatMaterial"; -import { CustomParams } from "../../../utils/setUniforms"; -import { Size } from "@react-three/fiber"; -import { MaterialProps } from "../../types"; -type TMaterials = AdvectionMaterial | DivergenceMaterial | CurlMaterial | PressureMaterial | ClearMaterial | GradientSubtractMaterial | SplatMaterial; -export type FluidMaterials = { - vorticityMaterial: VorticityMaterial; - curlMaterial: CurlMaterial; - advectionMaterial: AdvectionMaterial; - divergenceMaterial: DivergenceMaterial; - pressureMaterial: PressureMaterial; - clearMaterial: ClearMaterial; - gradientSubtractMaterial: GradientSubtractMaterial; - splatMaterial: SplatMaterial; -}; -export type CustomizableKeys = "advection" | "splat" | "curl" | "vorticity" | "divergence" | "clear" | "pressure" | "gradientSubtract"; -export type CustomFluidProps = { - [K in CustomizableKeys]?: MaterialProps; -}; -export type CustomFluidParams = { - [K in CustomizableKeys]?: CustomParams; -}; -/** - * Returns the material update function in the second argument - */ -export declare const useMesh: ({ scene, size, dpr, customFluidProps, }: { - scene: THREE.Scene; - size: Size; - dpr: number | false; - customFluidProps?: CustomFluidProps | undefined; -}) => { - materials: { - vorticityMaterial: VorticityMaterial; - curlMaterial: CurlMaterial; - advectionMaterial: AdvectionMaterial; - divergenceMaterial: DivergenceMaterial; - pressureMaterial: PressureMaterial; - clearMaterial: ClearMaterial; - gradientSubtractMaterial: GradientSubtractMaterial; - splatMaterial: SplatMaterial; - }; - setMeshMaterial: (material: TMaterials) => void; - mesh: THREE.Mesh, THREE.ShaderMaterial>; -}; -export {}; 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 deleted file mode 100644 index 3981de6b..00000000 --- a/packages/use-shader-fx/types/fxs/simulations/useRipple/index.d.ts +++ /dev/null @@ -1,39 +0,0 @@ -import * as THREE from "three"; -import { PointerValues } from "../../../misc/usePointer"; -import { HooksProps, HooksReturn } from "../../types"; -import { CustomParams } from "../../../utils/setUniforms"; -export type RippleParams = { - /** How often ripples appear, default : `0.01` */ - frequency?: number; - /** rotation rate, default : `0.05` */ - rotation?: number; - /** fadeout speed, default : `0.9` */ - fadeout_speed?: number; - /** scale rate, default : `0.3` */ - scale?: number; - /** alpha, default : `0.6` */ - alpha?: number; - /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */ - pointerValues?: PointerValues | false; -}; -export type RippleObject = { - scene: THREE.Scene; - meshArr: THREE.Mesh[]; - camera: THREE.Camera; - renderTarget: THREE.WebGLRenderTarget; - output: THREE.Texture; -}; -export declare const RIPPLE_PARAMS: RippleParams; -interface UseRippleProps extends HooksProps { - /** texture applied to ripple */ - texture?: THREE.Texture; - /** ripple size, default:64 */ - scale?: number; - /** ripple max length, default:100 */ - max?: number; -} -/** - * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage - */ -export declare const useRipple: ({ texture, scale, max, size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: UseRippleProps) => HooksReturn; -export {}; diff --git a/packages/use-shader-fx/types/fxs/simulations/useRipple/useMesh.d.ts b/packages/use-shader-fx/types/fxs/simulations/useRipple/useMesh.d.ts deleted file mode 100644 index f493452e..00000000 --- a/packages/use-shader-fx/types/fxs/simulations/useRipple/useMesh.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import * as THREE from "three"; -import { MaterialProps } from "../../types"; -type UseMeshProps = { - scale: number; - max: number; - scene: THREE.Scene; - texture?: THREE.Texture; -}; -export declare const useMesh: ({ scale, max, texture, scene, uniforms, onBeforeCompile, }: UseMeshProps & MaterialProps) => THREE.Mesh[]; -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 deleted file mode 100644 index 193a9f48..00000000 --- a/packages/use-shader-fx/types/fxs/types/index.d.ts +++ /dev/null @@ -1,57 +0,0 @@ -import * as THREE from "three"; -import { RootState, Size } from "@react-three/fiber"; -export type Dpr = number | { - /** you can set whether `dpr` affects `shader`. default : `false` */ - shader?: false | number; - /** you can set whether `dpr` affects `fbo`. default : `false` */ - fbo?: false | number; -}; -export type MaterialProps = { - /** It is possible to add your own uniforms - they are not added to the GLSL and must be replace with `onBeforeCompile` */ - uniforms?: { - [uniform: string]: THREE.IUniform; - }; - /** - * An optional callback that is executed immediately before the shader program is compiled. `use-shader-fx` already defines `onBeforeCompile`, so pass the function to this props instead of redefining it in material. - * @param shader — Source code of the shader - * @param renderer — WebGLRenderer Context that is initializing the material - */ - onBeforeCompile?: (shader: THREE.Shader, renderer: THREE.WebGLRenderer) => void; -}; -export interface HooksProps extends MaterialProps { - size: Size; - dpr: Dpr; - /** Defines the count of MSAA samples. Can only be used with WebGL 2. default : `0` */ - samples?: number; - /** Whether to `setSize` the FBO when updating size or dpr. default : `false` */ - isSizeUpdate?: boolean; -} -/** - * @returns {HooksReturn} - * updateFx - Functions to update parameters and render. - * updateParams - Function to update parameters only. - * fxObject - An object containing various FX components such as scene, camera, material, and render target. - * - * @template T The type for the parameters of the hooks. - * @template O The type for the FX object. - * @template C The type for the custom parameters. - */ -export type HooksReturn = [ - /** - * Functions to update parameters and render. - * @param rootState RootState - * @param newParams params of fxHooks - * @param customParams custom params, added to `uniforms` during initialisation - */ - (rootState: RootState, newParams?: T, customParams?: C) => THREE.Texture, - /** - * Function to update parameters only. - * @param newParams params of fxHooks - * @param customParams custom params, added to `uniforms` during initialisation - */ - (newParams?: T, customParams?: C) => void, - /** - * Contains each part of FX such as scene, camera, material, render target, etc. - */ - O -]; 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 deleted file mode 100644 index d6067992..00000000 --- a/packages/use-shader-fx/types/fxs/utils/useAlphaBlending/index.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -import * as THREE from "three"; -import { CustomParams } from "../../../utils/setUniforms"; -import { HooksProps, HooksReturn } from "../../types"; -export type AlphaBlendingParams = { - /** default : `THREE.Texture()` */ - texture?: THREE.Texture; - /** alpha map , default : `THREE.Texture()` */ - map?: THREE.Texture; -}; -export type AlphaBlendingObject = { - scene: THREE.Scene; - mesh: THREE.Mesh; - material: THREE.Material; - camera: THREE.Camera; - renderTarget: THREE.WebGLRenderTarget; - output: THREE.Texture; -}; -export declare const ALPHABLENDING_PARAMS: AlphaBlendingParams; -/** - * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage - */ -export declare const useAlphaBlending: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useAlphaBlending/useMesh.d.ts b/packages/use-shader-fx/types/fxs/utils/useAlphaBlending/useMesh.d.ts deleted file mode 100644 index 6ec5051d..00000000 --- a/packages/use-shader-fx/types/fxs/utils/useAlphaBlending/useMesh.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -import * as THREE from "three"; -import { Size } from "@react-three/fiber"; -import { MaterialProps } from "../../types"; -export declare class AlphaBlendingMaterial extends THREE.ShaderMaterial { - uniforms: { - uTexture: { - value: THREE.Texture; - }; - uMap: { - value: THREE.Texture; - }; - }; -} -export declare const useMesh: ({ scene, uniforms, onBeforeCompile, }: { - scene: THREE.Scene; - size: Size; -} & MaterialProps) => { - material: AlphaBlendingMaterial; - mesh: THREE.Mesh, AlphaBlendingMaterial>; -}; diff --git a/packages/use-shader-fx/types/fxs/utils/useBlending/index.d.ts b/packages/use-shader-fx/types/fxs/utils/useBlending/index.d.ts deleted file mode 100644 index 341c196f..00000000 --- a/packages/use-shader-fx/types/fxs/utils/useBlending/index.d.ts +++ /dev/null @@ -1,36 +0,0 @@ -import * as THREE from "three"; -import { CustomParams } from "../../../utils/setUniforms"; -import { HooksProps, HooksReturn } from "../../types"; -export type BlendingParams = { - /** Make this texture Blending , default : `THREE.Texture` */ - texture?: THREE.Texture; - /** map texture, default : `THREE.Texture` */ - map?: THREE.Texture; - /** map strength , r,g value are affecting , default : `0.3` */ - mapIntensity?: number; - /** Alpha blending is performed using the alpha of the set texture. , default : `false` */ - alphaMap?: THREE.Texture | false; - /** default : `(0.5,0.5,0.5)` */ - brightness?: THREE.Vector3; - /** default : `0.0` */ - min?: number; - /** default : `1.0` */ - max?: number; - /** If set, this value will apply color dodge , default : `false` */ - dodgeColor?: THREE.Color | false; -}; -export type BlendingObject = { - scene: THREE.Scene; - mesh: THREE.Mesh; - material: THREE.Material; - camera: THREE.Camera; - renderTarget: THREE.WebGLRenderTarget; - output: THREE.Texture; -}; -export declare const BLENDING_PARAMS: BlendingParams; -/** - * Blend map to texture. You can set the threshold for blending with brightness. You can set the dodge color by setting color. -If you don't want to reflect the map's color, you can use useFxBlending instead. - * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage - */ -export declare const useBlending: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useBlending/useMesh.d.ts b/packages/use-shader-fx/types/fxs/utils/useBlending/useMesh.d.ts deleted file mode 100644 index 920c95e9..00000000 --- a/packages/use-shader-fx/types/fxs/utils/useBlending/useMesh.d.ts +++ /dev/null @@ -1,42 +0,0 @@ -import * as THREE from "three"; -import { MaterialProps } from "../../types"; -export declare class BlendingMaterial extends THREE.ShaderMaterial { - uniforms: { - u_texture: { - value: THREE.Texture; - }; - uMap: { - value: THREE.Texture; - }; - u_alphaMap: { - value: THREE.Texture; - }; - u_isAlphaMap: { - value: boolean; - }; - uMapIntensity: { - value: number; - }; - u_brightness: { - value: THREE.Vector3; - }; - u_min: { - value: number; - }; - u_max: { - value: number; - }; - u_dodgeColor: { - value: THREE.Color; - }; - u_isDodgeColor: { - value: boolean; - }; - }; -} -export declare const useMesh: ({ scene, uniforms, onBeforeCompile, }: { - scene: THREE.Scene; -} & MaterialProps) => { - material: BlendingMaterial; - mesh: THREE.Mesh, BlendingMaterial>; -}; diff --git a/packages/use-shader-fx/types/fxs/utils/useBrightnessPicker/index.d.ts b/packages/use-shader-fx/types/fxs/utils/useBrightnessPicker/index.d.ts deleted file mode 100644 index dde48bae..00000000 --- a/packages/use-shader-fx/types/fxs/utils/useBrightnessPicker/index.d.ts +++ /dev/null @@ -1,26 +0,0 @@ -import * as THREE from "three"; -import { CustomParams } from "../../../utils/setUniforms"; -import { HooksProps, HooksReturn } from "../../types"; -export type BrightnessPickerParams = { - /** pick brightness from this texture , default : `THREE.Texture` */ - texture?: THREE.Texture; - /** default : `(0.5,0.5,0.5)` */ - brightness?: THREE.Vector3; - /** default : `0.0` */ - min?: number; - /** default : `1.0` */ - max?: number; -}; -export type BrightnessPickerObject = { - scene: THREE.Scene; - mesh: THREE.Mesh; - material: THREE.Material; - camera: THREE.Camera; - renderTarget: THREE.WebGLRenderTarget; - output: THREE.Texture; -}; -export declare const BRIGHTNESSPICKER_PARAMS: BrightnessPickerParams; -/** - * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage - */ -export declare const useBrightnessPicker: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useBrightnessPicker/useMesh.d.ts b/packages/use-shader-fx/types/fxs/utils/useBrightnessPicker/useMesh.d.ts deleted file mode 100644 index 8fae42cc..00000000 --- a/packages/use-shader-fx/types/fxs/utils/useBrightnessPicker/useMesh.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -import * as THREE from "three"; -import { MaterialProps } from "../../types"; -export declare class BrightnessPickerMaterial extends THREE.ShaderMaterial { - uniforms: { - u_texture: { - value: THREE.Texture; - }; - u_brightness: { - value: THREE.Vector3; - }; - u_min: { - value: number; - }; - u_max: { - value: number; - }; - }; -} -export declare const useMesh: ({ scene, uniforms, onBeforeCompile, }: { - scene: THREE.Scene; -} & MaterialProps) => { - material: BrightnessPickerMaterial; - mesh: THREE.Mesh, BrightnessPickerMaterial>; -}; diff --git a/packages/use-shader-fx/types/fxs/utils/useCoverTexture/index.d.ts b/packages/use-shader-fx/types/fxs/utils/useCoverTexture/index.d.ts deleted file mode 100644 index 253c2b1d..00000000 --- a/packages/use-shader-fx/types/fxs/utils/useCoverTexture/index.d.ts +++ /dev/null @@ -1,20 +0,0 @@ -import * as THREE from "three"; -import { CustomParams } from "../../../utils/setUniforms"; -import { HooksProps, HooksReturn } from "../../types"; -export type CoverTextureParams = { - /** Textures that you want to display exactly on the screen , default : `THREE.Texture()` */ - texture?: THREE.Texture; -}; -export type CoverTextureObject = { - scene: THREE.Scene; - mesh: THREE.Mesh; - material: THREE.Material; - camera: THREE.Camera; - renderTarget: THREE.WebGLRenderTarget; - output: THREE.Texture; -}; -export declare const COVERTEXTURE_PARAMS: CoverTextureParams; -/** - * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage - */ -export declare const useCoverTexture: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useCoverTexture/useMesh.d.ts b/packages/use-shader-fx/types/fxs/utils/useCoverTexture/useMesh.d.ts deleted file mode 100644 index 19dc6622..00000000 --- a/packages/use-shader-fx/types/fxs/utils/useCoverTexture/useMesh.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -import * as THREE from "three"; -import { Size } from "@react-three/fiber"; -import { MaterialProps } from "../../types"; -export declare class FxTextureMaterial extends THREE.ShaderMaterial { - uniforms: { - uResolution: { - value: THREE.Vector2; - }; - uTextureResolution: { - value: THREE.Vector2; - }; - uTexture: { - value: THREE.Texture; - }; - }; -} -export declare const useMesh: ({ scene, size, dpr, uniforms, onBeforeCompile, }: { - scene: THREE.Scene; - size: Size; - dpr: number | false; -} & MaterialProps) => { - material: FxTextureMaterial; - mesh: THREE.Mesh, FxTextureMaterial>; -}; diff --git a/packages/use-shader-fx/types/fxs/utils/useDuoTone/index.d.ts b/packages/use-shader-fx/types/fxs/utils/useDuoTone/index.d.ts deleted file mode 100644 index c9721a04..00000000 --- a/packages/use-shader-fx/types/fxs/utils/useDuoTone/index.d.ts +++ /dev/null @@ -1,25 +0,0 @@ -import * as THREE from "three"; -import { DuoToneMaterial } from "./useMesh"; -import { CustomParams } from "../../../utils/setUniforms"; -import { HooksProps, HooksReturn } from "../../types"; -export type DuoToneParams = { - /** Make this texture duotone , Default : `THREE.Texture()` */ - texture?: THREE.Texture; - /** 1st color , Default : `THREE.Color(0xffffff)` */ - color0?: THREE.Color; - /** 2nd color , Default : `THREE.Color(0x000000)` */ - color1?: THREE.Color; -}; -export type DuoToneObject = { - scene: THREE.Scene; - mesh: THREE.Mesh; - material: DuoToneMaterial; - camera: THREE.Camera; - renderTarget: THREE.WebGLRenderTarget; - output: THREE.Texture; -}; -export declare const DUOTONE_PARAMS: DuoToneParams; -/** - * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage - */ -export declare const useDuoTone: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useDuoTone/useMesh.d.ts b/packages/use-shader-fx/types/fxs/utils/useDuoTone/useMesh.d.ts deleted file mode 100644 index feb4e1bd..00000000 --- a/packages/use-shader-fx/types/fxs/utils/useDuoTone/useMesh.d.ts +++ /dev/null @@ -1,21 +0,0 @@ -import * as THREE from "three"; -import { MaterialProps } from "../../types"; -export declare class DuoToneMaterial extends THREE.ShaderMaterial { - uniforms: { - uTexture: { - value: THREE.Texture; - }; - uColor0: { - value: THREE.Color; - }; - uColor1: { - value: THREE.Color; - }; - }; -} -export declare const useMesh: ({ scene, uniforms, onBeforeCompile, }: { - scene: THREE.Scene; -} & MaterialProps) => { - material: DuoToneMaterial; - mesh: THREE.Mesh, DuoToneMaterial>; -}; diff --git a/packages/use-shader-fx/types/fxs/utils/useFxBlending/index.d.ts b/packages/use-shader-fx/types/fxs/utils/useFxBlending/index.d.ts deleted file mode 100644 index f245d53c..00000000 --- a/packages/use-shader-fx/types/fxs/utils/useFxBlending/index.d.ts +++ /dev/null @@ -1,25 +0,0 @@ -import * as THREE from "three"; -import { CustomParams } from "../../../utils/setUniforms"; -import { HooksProps, HooksReturn } from "../../types"; -export type FxBlendingParams = { - /** Make this texture Blending , default : `THREE.Texture` */ - texture?: THREE.Texture; - /** map texture, default : `THREE.Texture` */ - map?: THREE.Texture; - /** map strength , r,g value are affecting , default : `0.3` */ - mapIntensity?: number; -}; -export type FxBlendingObject = { - scene: THREE.Scene; - mesh: THREE.Mesh; - material: THREE.Material; - camera: THREE.Camera; - renderTarget: THREE.WebGLRenderTarget; - output: THREE.Texture; -}; -export declare const FXBLENDING_PARAMS: FxBlendingParams; -/** - * Blend map to texture. You can change the intensity of fx applied by the rg value of map. Unlike "useBlending", the map color is not reflected. - * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage - */ -export declare const useFxBlending: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useFxBlending/useMesh.d.ts b/packages/use-shader-fx/types/fxs/utils/useFxBlending/useMesh.d.ts deleted file mode 100644 index 7a640d0f..00000000 --- a/packages/use-shader-fx/types/fxs/utils/useFxBlending/useMesh.d.ts +++ /dev/null @@ -1,21 +0,0 @@ -import * as THREE from "three"; -import { MaterialProps } from "../../types"; -export declare class FxBlendingMaterial extends THREE.ShaderMaterial { - uniforms: { - u_texture: { - value: THREE.Texture; - }; - uMap: { - value: THREE.Texture; - }; - uMapIntensity: { - value: number; - }; - }; -} -export declare const useMesh: ({ scene, uniforms, onBeforeCompile, }: { - scene: THREE.Scene; -} & MaterialProps) => { - material: FxBlendingMaterial; - mesh: THREE.Mesh, FxBlendingMaterial>; -}; diff --git a/packages/use-shader-fx/types/fxs/utils/useFxTexture/index.d.ts b/packages/use-shader-fx/types/fxs/utils/useFxTexture/index.d.ts deleted file mode 100644 index fede8b0b..00000000 --- a/packages/use-shader-fx/types/fxs/utils/useFxTexture/index.d.ts +++ /dev/null @@ -1,36 +0,0 @@ -import * as THREE from "three"; -import { CustomParams } from "../../../utils/setUniforms"; -import { HooksProps, HooksReturn } from "../../types"; -export type FxTextureParams = { - /** 1st texture , default : `THREE.Texture()` */ - texture0?: THREE.Texture; - /** 2nd texture , default : `THREE.Texture()` */ - texture1?: THREE.Texture; - /** add transparent padding, 0.0 ~ 1.0 , default : `0.0` */ - padding?: number; - /** The color map. The uv value is affected according to this rbg , default : `THREE.Texture()` */ - map?: THREE.Texture; - /** intensity of map , r,g value are affecting , default : `0.0` */ - mapIntensity?: number; - /** Intensity of effect on edges , default : `0.0` */ - edgeIntensity?: number; - /** epicenter of fx, -1 ~ 1 , default : `vec2(0.0,0.0)` */ - epicenter?: THREE.Vector2; - /** Switch value to switch between texture0 and texture1 , 0 ~ 1 , default : `0` */ - progress?: number; - /** direction of transition , default: `THREE.Vector2(0, 0)` */ - dir?: THREE.Vector2; -}; -export type FxTextureObject = { - scene: THREE.Scene; - mesh: THREE.Mesh; - material: THREE.Material; - camera: THREE.Camera; - renderTarget: THREE.WebGLRenderTarget; - output: THREE.Texture; -}; -export declare const FXTEXTURE_PARAMS: FxTextureParams; -/** - * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage - */ -export declare const useFxTexture: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useFxTexture/useMesh.d.ts b/packages/use-shader-fx/types/fxs/utils/useFxTexture/useMesh.d.ts deleted file mode 100644 index 23699c48..00000000 --- a/packages/use-shader-fx/types/fxs/utils/useFxTexture/useMesh.d.ts +++ /dev/null @@ -1,51 +0,0 @@ -import * as THREE from "three"; -import { Size } from "@react-three/fiber"; -import { MaterialProps } from "../../types"; -export declare class FxTextureMaterial extends THREE.ShaderMaterial { - uniforms: { - uResolution: { - value: THREE.Vector2; - }; - uTextureResolution: { - value: THREE.Vector2; - }; - uTexture0: { - value: THREE.Texture; - }; - uTexture1: { - value: THREE.Texture; - }; - padding: { - value: number; - }; - uMap: { - value: THREE.Texture; - }; - edgeIntensity: { - value: number; - }; - mapIntensity: { - value: number; - }; - epicenter: { - value: THREE.Vector2; - }; - progress: { - value: number; - }; - dirX: { - value: number; - }; - dirY: { - value: number; - }; - }; -} -export declare const useMesh: ({ scene, size, dpr, uniforms, onBeforeCompile, }: { - scene: THREE.Scene; - size: Size; - dpr: number | false; -} & MaterialProps) => { - material: FxTextureMaterial; - mesh: THREE.Mesh, FxTextureMaterial>; -}; diff --git a/packages/use-shader-fx/types/fxs/utils/useHSV/index.d.ts b/packages/use-shader-fx/types/fxs/utils/useHSV/index.d.ts deleted file mode 100644 index 09a3b3ce..00000000 --- a/packages/use-shader-fx/types/fxs/utils/useHSV/index.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -import * as THREE from "three"; -import { CustomParams } from "../../../utils/setUniforms"; -import { HooksProps, HooksReturn } from "../../types"; -export type HSVParams = { - /** default : `THREE.Texture()` */ - texture?: THREE.Texture; - /** default : `1` */ - brightness?: number; - /** default : `1` */ - saturation?: number; -}; -export type HSVObject = { - scene: THREE.Scene; - mesh: THREE.Mesh; - material: THREE.Material; - camera: THREE.Camera; - renderTarget: THREE.WebGLRenderTarget; - output: THREE.Texture; -}; -export declare const HSV_PARAMS: HSVParams; -/** - * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage - */ -export declare const useHSV: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useHSV/useMesh.d.ts b/packages/use-shader-fx/types/fxs/utils/useHSV/useMesh.d.ts deleted file mode 100644 index d5068250..00000000 --- a/packages/use-shader-fx/types/fxs/utils/useHSV/useMesh.d.ts +++ /dev/null @@ -1,23 +0,0 @@ -import * as THREE from "three"; -import { Size } from "@react-three/fiber"; -import { MaterialProps } from "../../types"; -export declare class HSVMaterial extends THREE.ShaderMaterial { - uniforms: { - u_texture: { - value: THREE.Texture; - }; - u_brightness: { - value: number; - }; - u_saturation: { - value: number; - }; - }; -} -export declare const useMesh: ({ scene, uniforms, onBeforeCompile, }: { - scene: THREE.Scene; - size: Size; -} & MaterialProps) => { - material: HSVMaterial; - mesh: THREE.Mesh, HSVMaterial>; -}; diff --git a/packages/use-shader-fx/types/index.d.ts b/packages/use-shader-fx/types/index.d.ts deleted file mode 100644 index f956940b..00000000 --- a/packages/use-shader-fx/types/index.d.ts +++ /dev/null @@ -1,37 +0,0 @@ -export * from "./fxs/interactions/useBrush"; -export * from "./fxs/simulations/useFluid"; -export * from "./fxs/simulations/useRipple"; -export * from "./fxs/noises/useNoise"; -export * from "./fxs/noises/useColorStrata"; -export * from "./fxs/noises/useMarble"; -export * from "./fxs/noises/useCosPalette"; -export * from "./fxs/utils/useDuoTone"; -export * from "./fxs/utils/useBlending"; -export * from "./fxs/utils/useFxTexture"; -export * from "./fxs/utils/useBrightnessPicker"; -export * from "./fxs/utils/useFxBlending"; -export * from "./fxs/utils/useAlphaBlending"; -export * from "./fxs/utils/useHSV"; -export * from "./fxs/utils/useCoverTexture"; -export * from "./fxs/effects/useSimpleBlur"; -export * from "./fxs/effects/useMotionBlur"; -export * from "./fxs/effects/useWave"; -export * from "./fxs/misc/useChromaKey"; -export * from "./fxs/misc/useBlank"; -export * from "./fxs/3D/useMorphParticles"; -export * from "./fxs/3D/useMorphParticles/useCreateMorphParticles"; -export * from "./fxs/3D/useWobble3D"; -export * from "./fxs/3D/useWobble3D/useCreateWobble3D"; -export * from "./utils/setUniforms"; -export * from "./utils/useAddMesh"; -export * from "./utils/useCamera"; -export * from "./utils/useDoubleFBO"; -export * from "./utils/useParams"; -export * from "./utils/useResolution"; -export * from "./utils/useSingleFBO"; -export * from "./misc/usePointer"; -export * from "./misc/useBeat"; -export * from "./misc/useFPSLimiter"; -export * from "./misc/useDomSyncer"; -export * from "./misc/useCopyTexture"; -export * from "./libs/easing"; diff --git a/packages/use-shader-fx/types/libs/constants.d.ts b/packages/use-shader-fx/types/libs/constants.d.ts deleted file mode 100644 index abd77be4..00000000 --- a/packages/use-shader-fx/types/libs/constants.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import * as THREE from "three"; -export declare const ISDEV: boolean; -export declare const MATERIAL_BASIC_PARAMS: { - transparent: boolean; - depthTest: boolean; - depthWrite: boolean; -}; -export declare const DEFAULT_TEXTURE: THREE.DataTexture; diff --git a/packages/use-shader-fx/types/libs/easing.d.ts b/packages/use-shader-fx/types/libs/easing.d.ts deleted file mode 100644 index 41ba49de..00000000 --- a/packages/use-shader-fx/types/libs/easing.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -export type EasingTypes = "easeInSine" | "easeOutSine" | "easeInOutSine" | "easeInQuad" | "easeOutQuad" | "easeInOutQuad" | "easeInCubic" | "easeOutCubic" | "easeInOutCubic" | "easeInQuart" | "easeOutQuart" | "easeInOutQuart" | "easeInQuint" | "easeOutQuint" | "easeInOutQuint" | "easeInExpo" | "easeOutExpo" | "easeInOutExpo" | "easeInCirc" | "easeOutCirc" | "easeInOutCirc" | "easeInBack" | "easeOutBack" | "easeInOutBack" | "easeInElastic" | "easeOutElastic" | "easeInOutElastic" | "easeInBounce" | "easeOutBounce" | "easeInOutBounce"; -type EasingFunctions = { - [K in EasingTypes]: (x: number) => number; -}; -/** - * from https://github.com/ai/easings.net - */ -export declare const Easing: EasingFunctions; -export {}; diff --git a/packages/use-shader-fx/types/libs/shaders/resolveShaders.d.ts b/packages/use-shader-fx/types/libs/shaders/resolveShaders.d.ts deleted file mode 100644 index 3639fce5..00000000 --- a/packages/use-shader-fx/types/libs/shaders/resolveShaders.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -import * as THREE from "three"; -export declare const resolveShaders: (shader: THREE.Shader) => void; diff --git a/packages/use-shader-fx/types/misc/useBeat.d.ts b/packages/use-shader-fx/types/misc/useBeat.d.ts deleted file mode 100644 index 7ec43cc6..00000000 --- a/packages/use-shader-fx/types/misc/useBeat.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import * as THREE from "three"; -import { EasingTypes } from "../libs/easing"; -type BeatValues = { - beat: number; - floor: number; - fract: number; - /** unique hash specific to the beat */ - hash: number; -}; -/** - * @param ease easing functions are referenced from https://github.com/ai/easings.net , default : "easeOutQuart" - */ -export declare const useBeat: (bpm: number, ease?: EasingTypes) => (clock: THREE.Clock) => BeatValues; -export {}; diff --git a/packages/use-shader-fx/types/misc/useCopyTexture.d.ts b/packages/use-shader-fx/types/misc/useCopyTexture.d.ts deleted file mode 100644 index 74bb78d5..00000000 --- a/packages/use-shader-fx/types/misc/useCopyTexture.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -import * as THREE from "three"; -import { UseFboProps } from "../utils/useSingleFBO"; -type UpdateCopyFunction = (gl: THREE.WebGLRenderer, index: number, -/** call before FBO is rendered */ -onBeforeRender?: ({ read }: { - read: THREE.Texture; -}) => void) => THREE.Texture; -type UseCopyTextureReturn = [THREE.WebGLRenderTarget[], UpdateCopyFunction]; -/** - * Generate an FBO array to copy the texture. - * @param dpr If dpr is set, dpr will be multiplied, default : `false` - * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false` - * @param length The number of FBOs to create - * @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. - */ -export declare const useCopyTexture: ({ scene, camera, size, dpr, isSizeUpdate, samples, depthBuffer, depthTexture, }: UseFboProps, length: number) => UseCopyTextureReturn; -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 deleted file mode 100644 index 0f75ebaf..00000000 --- a/packages/use-shader-fx/types/misc/useDomSyncer/index.d.ts +++ /dev/null @@ -1,45 +0,0 @@ -import * as THREE from "three"; -import { Key } from "react"; -import { HooksProps, HooksReturn } from "../../fxs/types"; -import { IsIntersecting } from "./utils/useIsIntersecting"; -import { UseDomView } from "./utils/createUseDomView"; -import { CustomParams } from "../../utils/setUniforms"; -export type DomSyncerParams = { - /** DOM array you want to synchronize */ - dom?: (HTMLElement | Element | null)[]; - /** Texture array that you want to synchronize with the DOM rectangle */ - texture?: THREE.Texture[]; - /** default : `0.0[]` */ - boderRadius?: number[]; - /** the angle you want to rotate */ - rotation?: THREE.Euler[]; - /** Array of callback functions when crossed */ - onIntersect?: ((entry: IntersectionObserverEntry) => void)[]; - /** Because DOM rendering and React updates occur asynchronously, there may be a lag between updating dependent arrays and setting DOM arrays. That's what the Key is for. If the dependent array is updated but the Key is not, the loop will skip and return an empty texture. By updating the timing key when DOM acquisition is complete, you can perfectly synchronize DOM and Mesh updates.updateKey must be a unique value for each update, for example `performance.now()`.*/ - updateKey?: Key; -}; -export type DomSyncerObject = { - scene: THREE.Scene; - camera: THREE.Camera; - renderTarget: THREE.WebGLRenderTarget; - output: THREE.Texture; - /** - * A function that returns a determination whether the DOM intersects or not. - * The boolean will be updated after executing the onIntersect function. - * @param index - Index of the dom for which you want to return an intersection decision. -1 will return the entire array. - * @param once - If set to true, it will continue to return true once crossed. - */ - isIntersecting: IsIntersecting; - /** target's DOMRect[] */ - DOMRects: DOMRect[]; - /** target's intersetions boolean[] */ - intersections: boolean[]; - /** You can set callbacks for when at least one DOM is visible and when it is completely hidden. */ - useDomView: UseDomView; -}; -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, uniforms, onBeforeCompile }: HooksProps, dependencies?: import("react").DependencyList) => HooksReturn; diff --git a/packages/use-shader-fx/types/misc/useDomSyncer/utils/createMesh.d.ts b/packages/use-shader-fx/types/misc/useDomSyncer/utils/createMesh.d.ts deleted file mode 100644 index 478b7e48..00000000 --- a/packages/use-shader-fx/types/misc/useDomSyncer/utils/createMesh.d.ts +++ /dev/null @@ -1,25 +0,0 @@ -import * as THREE from "three"; -import { DomSyncerParams } from "../"; -import { Size } from "@react-three/fiber"; -import { MaterialProps } from "../../../fxs/types"; -export declare class DomSyncerMaterial extends THREE.ShaderMaterial { - uniforms: { - u_texture: { - value: THREE.Texture; - }; - u_textureResolution: { - value: THREE.Vector2; - }; - u_resolution: { - value: THREE.Vector2; - }; - u_borderRadius: { - value: number; - }; - }; -} -export declare const createMesh: ({ params, scene, uniforms, onBeforeCompile, }: { - params: DomSyncerParams; - size: Size; - scene: THREE.Scene; -} & MaterialProps) => void; diff --git a/packages/use-shader-fx/types/misc/useDomSyncer/utils/createUseDomView.d.ts b/packages/use-shader-fx/types/misc/useDomSyncer/utils/createUseDomView.d.ts deleted file mode 100644 index 7e5535e2..00000000 --- a/packages/use-shader-fx/types/misc/useDomSyncer/utils/createUseDomView.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -export type UseDomViewProps = { - onView?: () => void; - onHidden?: () => void; -}; -export type UseDomView = (props: UseDomViewProps) => void; -export declare const createUseDomView: (isIntersectingRef: React.MutableRefObject) => UseDomView; diff --git a/packages/use-shader-fx/types/misc/useDomSyncer/utils/errorHandler.d.ts b/packages/use-shader-fx/types/misc/useDomSyncer/utils/errorHandler.d.ts deleted file mode 100644 index 657c3b43..00000000 --- a/packages/use-shader-fx/types/misc/useDomSyncer/utils/errorHandler.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -import { DomSyncerParams } from ".."; -export declare const errorHandler: (params: DomSyncerParams) => boolean; diff --git a/packages/use-shader-fx/types/misc/useDomSyncer/utils/useIntersectionHandler.d.ts b/packages/use-shader-fx/types/misc/useDomSyncer/utils/useIntersectionHandler.d.ts deleted file mode 100644 index cd25a98a..00000000 --- a/packages/use-shader-fx/types/misc/useDomSyncer/utils/useIntersectionHandler.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { DomSyncerParams } from ".."; -export declare const useIntersectionHandler: () => ({ isIntersectingRef, isIntersectingOnceRef, params, }: { - isIntersectingRef: React.MutableRefObject; - isIntersectingOnceRef: React.MutableRefObject; - params: DomSyncerParams; -}) => void; diff --git a/packages/use-shader-fx/types/misc/useDomSyncer/utils/useIsIntersecting.d.ts b/packages/use-shader-fx/types/misc/useDomSyncer/utils/useIsIntersecting.d.ts deleted file mode 100644 index ccc3f896..00000000 --- a/packages/use-shader-fx/types/misc/useDomSyncer/utils/useIsIntersecting.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -/// -export type IsIntersecting = (index: number, once?: boolean) => boolean[] | boolean; -export declare const useIsIntersecting: () => { - isIntersectingRef: import("react").MutableRefObject; - isIntersectingOnceRef: import("react").MutableRefObject; - isIntersecting: IsIntersecting; -}; diff --git a/packages/use-shader-fx/types/misc/useDomSyncer/utils/useUpdateDomRect.d.ts b/packages/use-shader-fx/types/misc/useDomSyncer/utils/useUpdateDomRect.d.ts deleted file mode 100644 index 6d35df5c..00000000 --- a/packages/use-shader-fx/types/misc/useDomSyncer/utils/useUpdateDomRect.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -/// -import * as THREE from "three"; -import { DomSyncerParams } from ".."; -import { Size } from "@react-three/fiber"; -import { CustomParams } from "../../../utils/setUniforms"; -type UpdateDomRect = ({ params, customParams, size, resolutionRef, scene, isIntersectingRef, }: { - params: DomSyncerParams; - customParams?: CustomParams; - size: Size; - resolutionRef: React.MutableRefObject; - scene: THREE.Scene; - isIntersectingRef: React.MutableRefObject; -}) => void; -type UseUpdateDomRectReturn = [DOMRect[], UpdateDomRect]; -export declare const useUpdateDomRect: () => UseUpdateDomRectReturn; -export {}; diff --git a/packages/use-shader-fx/types/misc/useFPSLimiter.d.ts b/packages/use-shader-fx/types/misc/useFPSLimiter.d.ts deleted file mode 100644 index d3433567..00000000 --- a/packages/use-shader-fx/types/misc/useFPSLimiter.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import * as THREE from "three"; -/** - * @param fps FPS you want to limit , default : `60` - * - * ```tsx - * const limiter = useFPSLimiter(fps); - * useFrame((props) => { - * if (limiter(props.clock)) { - * //some code - * } - * }); - * ``` - */ -export declare const useFPSLimiter: (fps?: number) => (clock: THREE.Clock) => boolean; diff --git a/packages/use-shader-fx/types/misc/usePointer.d.ts b/packages/use-shader-fx/types/misc/usePointer.d.ts deleted file mode 100644 index 3d13a115..00000000 --- a/packages/use-shader-fx/types/misc/usePointer.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import * as THREE from "three"; -export type PointerValues = { - currentPointer: THREE.Vector2; - prevPointer: THREE.Vector2; - diffPointer: THREE.Vector2; - velocity: THREE.Vector2; - isVelocityUpdate: boolean; -}; -type UpdatePointer = (currentPointer: THREE.Vector2) => PointerValues; -/** - * @description When given the pointer vector2 from r3f's RootState, it generates an update function that returns {`currentPointer`, `prevPointer`, `diffPointer`, `isVelocityUpdate`, `velocity`}. - * @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`. - * @param lerp 0~1, lerp intensity (0 to less than 1) , default : `0` - */ -export declare const usePointer: (lerp?: number) => UpdatePointer; -export {}; diff --git a/packages/use-shader-fx/types/utils/getDpr.d.ts b/packages/use-shader-fx/types/utils/getDpr.d.ts deleted file mode 100644 index fb38dcca..00000000 --- a/packages/use-shader-fx/types/utils/getDpr.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Dpr } from "../fxs/types"; -export declare const getDpr: (dpr: Dpr) => { - shader: number | false; - fbo: number | false; -}; diff --git a/packages/use-shader-fx/types/utils/setOnBeforeCompile.d.ts b/packages/use-shader-fx/types/utils/setOnBeforeCompile.d.ts deleted file mode 100644 index 2d550dac..00000000 --- a/packages/use-shader-fx/types/utils/setOnBeforeCompile.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -type OnBeforeCompile = (shader: THREE.Shader, renderer: THREE.WebGLRenderer) => void; -export declare const setOnBeforeCompile: (onBeforeCompile?: OnBeforeCompile) => OnBeforeCompile; -export {}; diff --git a/packages/use-shader-fx/types/utils/setUniforms.d.ts b/packages/use-shader-fx/types/utils/setUniforms.d.ts deleted file mode 100644 index 82d9a9dc..00000000 --- a/packages/use-shader-fx/types/utils/setUniforms.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -type UniformValue = THREE.CubeTexture | THREE.Texture | Int32Array | Float32Array | THREE.Matrix4 | THREE.Matrix3 | THREE.Quaternion | THREE.Vector4 | THREE.Vector3 | THREE.Vector2 | THREE.Color | number | boolean | Array | null | undefined; -type UniformObject = { - [key: string]: { - value: UniformValue; - }; -}; -export declare const setUniform: (material: { - uniforms: T; -}) => (key: keyof T, value: UniformValue) => void; -export type CustomParams = { - [uniform: string]: UniformValue; -}; -export declare const setCustomUniform: (material: { - uniforms: UniformObject; -}) => (customParams: CustomParams | undefined) => void; -export {}; diff --git a/packages/use-shader-fx/types/utils/useAddMesh.d.ts b/packages/use-shader-fx/types/utils/useAddMesh.d.ts deleted file mode 100644 index 04b96f7f..00000000 --- a/packages/use-shader-fx/types/utils/useAddMesh.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import * as THREE from "three"; -/** Generate mesh from geometry and material and add to scene */ -export declare const useAddMesh: (scene: THREE.Scene, geometry: THREE.BufferGeometry, material: THREE.Material) => THREE.Mesh, THREE.Material>; diff --git a/packages/use-shader-fx/types/utils/useAddObject.d.ts b/packages/use-shader-fx/types/utils/useAddObject.d.ts deleted file mode 100644 index 33090e52..00000000 --- a/packages/use-shader-fx/types/utils/useAddObject.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import * as THREE from "three"; -type Object3DConstructor = new (geometry: THREE.BufferGeometry, material: M) => T; -/** - * Add geometry and material to Object3D and add them to scene. - */ -export declare const useAddObject: , M extends THREE.Material>(scene: THREE.Scene | false, geometry: THREE.BufferGeometry, material: M, Proto: Object3DConstructor) => T; -export {}; diff --git a/packages/use-shader-fx/types/utils/useCamera.d.ts b/packages/use-shader-fx/types/utils/useCamera.d.ts deleted file mode 100644 index 39e93263..00000000 --- a/packages/use-shader-fx/types/utils/useCamera.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import * as THREE from "three"; -import { Size } from "@react-three/fiber"; -export declare const useCamera: (size: Size, cameraType?: "OrthographicCamera" | "PerspectiveCamera") => THREE.OrthographicCamera | THREE.PerspectiveCamera; diff --git a/packages/use-shader-fx/types/utils/useDoubleFBO.d.ts b/packages/use-shader-fx/types/utils/useDoubleFBO.d.ts deleted file mode 100644 index b737bdf8..00000000 --- a/packages/use-shader-fx/types/utils/useDoubleFBO.d.ts +++ /dev/null @@ -1,26 +0,0 @@ -import * as THREE from "three"; -import { UseFboProps } from "./useSingleFBO"; -export type DoubleRenderTarget = { - read: THREE.WebGLRenderTarget | null; - write: THREE.WebGLRenderTarget | null; -}; -type FBOUpdateFunction = (gl: THREE.WebGLRenderer, -/** call before FBO is rendered */ -onBeforeRender?: ({ read, write, }: { - read: THREE.Texture; - write: THREE.Texture; -}) => void) => THREE.Texture; -type UseDoubleFBOReturn = [ - { - read: THREE.WebGLRenderTarget; - write: THREE.WebGLRenderTarget; - }, - FBOUpdateFunction -]; -/** - * @param dpr If dpr is set, dpr will be multiplied, default : `false` - * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false` - * @returns [{read:THREE.WebGLRenderTarget,write:THREE.WebGLRenderTarget} , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument. - */ -export declare const useDoubleFBO: ({ scene, camera, size, dpr, isSizeUpdate, samples, depthBuffer, depthTexture, }: UseFboProps) => UseDoubleFBOReturn; -export {}; diff --git a/packages/use-shader-fx/types/utils/useParams.d.ts b/packages/use-shader-fx/types/utils/useParams.d.ts deleted file mode 100644 index 012d0b59..00000000 --- a/packages/use-shader-fx/types/utils/useParams.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -type SetParams = (newParams?: Partial) => void; -type UseParamsReturn = [T, SetParams]; -/** - * @param params Receives an initial value object. With structuredClone, deep copy and set, but if the object contains a function, just set it. - */ -export declare const useParams: (params: T) => UseParamsReturn; -export {}; diff --git a/packages/use-shader-fx/types/utils/useResolution.d.ts b/packages/use-shader-fx/types/utils/useResolution.d.ts deleted file mode 100644 index 7216df87..00000000 --- a/packages/use-shader-fx/types/utils/useResolution.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import * as THREE from "three"; -import { Size } from "@react-three/fiber"; -/** - * @params dpr if dpr is set, it returns the resolution which is size multiplied by dpr. - */ -export declare const useResolution: (size: Size, dpr?: number | false) => THREE.Vector2; diff --git a/packages/use-shader-fx/types/utils/useSingleFBO.d.ts b/packages/use-shader-fx/types/utils/useSingleFBO.d.ts deleted file mode 100644 index f9d25d9d..00000000 --- a/packages/use-shader-fx/types/utils/useSingleFBO.d.ts +++ /dev/null @@ -1,39 +0,0 @@ -import * as THREE from "three"; -import { Size } from "@react-three/fiber"; -export declare const FBO_OPTION: THREE.RenderTargetOptions; -export type UseFboProps = { - scene: THREE.Scene; - camera: THREE.Camera; - size: Size; - /** If dpr is set, dpr will be multiplied, default : `false` */ - dpr?: number | false; - /** Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false` */ - isSizeUpdate?: boolean; - /** Defines the count of MSAA samples. Can only be used with WebGL 2. default : `0.0` */ - samples?: number; - /** Renders to the depth buffer. Unlike the three.js, default : `false` */ - depthBuffer?: boolean; - /** If set, the scene depth will be rendered to this texture. default : `false` */ - depthTexture?: boolean; -}; -export declare const renderFBO: ({ gl, fbo, scene, camera, onBeforeRender, onSwap, }: { - gl: THREE.WebGLRenderer; - fbo: THREE.WebGLRenderTarget; - scene: THREE.Scene; - camera: THREE.Camera; - onBeforeRender: () => void; - onSwap?: (() => void) | undefined; -}) => void; -type UpdateRenderTarget = (gl: THREE.WebGLRenderer, -/** call before FBO is rendered */ -onBeforeRender?: ({ read }: { - read: THREE.Texture; -}) => void) => THREE.Texture; -type UseSingleFBOReturn = [THREE.WebGLRenderTarget, UpdateRenderTarget]; -/** - * @param dpr If dpr is set, dpr will be multiplied, default:false - * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false - * @returns [THREE.WebGLRenderTarget , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument. - */ -export declare const useSingleFBO: ({ scene, camera, size, dpr, isSizeUpdate, samples, depthBuffer, depthTexture, }: UseFboProps) => UseSingleFBOReturn; -export {}; From 14f2f0d69115d3fa4c2f897016817e9cf15809ca Mon Sep 17 00:00:00 2001 From: takuma-hmng8 Date: Mon, 13 May 2024 14:16:01 +0900 Subject: [PATCH 2/3] fix:types --- packages/use-shader-fx/build/use-shader-fx.js | 4727 +++++++++++++++++ .../use-shader-fx/build/use-shader-fx.js.map | 1 + .../use-shader-fx/build/use-shader-fx.umd.cjs | 1571 ++++++ .../build/use-shader-fx.umd.cjs.map | 1 + packages/use-shader-fx/package-lock.json | 4 +- packages/use-shader-fx/package.json | 2 +- .../src/fxs/3D/useWobble3D/useMaterial.ts | 2 +- packages/use-shader-fx/src/fxs/types/index.ts | 4 +- .../src/libs/shaders/resolveShaders.ts | 8 +- .../src/utils/setOnBeforeCompile.ts | 9 +- .../use-shader-fx/src/utils/setUniforms.ts | 1 + .../types/fxs/3D/types/index.d.ts | 10 + .../types/fxs/3D/useMorphParticles/index.d.ts | 66 + .../useCreateMorphParticles.d.ts | 29 + .../utils/modifyAttributes.d.ts | 5 + .../utils/rewriteFragmentShader.d.ts | 5 + .../utils/rewriteVertexShader.d.ts | 2 + .../utils/useCreateObject.d.ts | 13 + .../useMorphParticles/utils/useMaterial.d.ts | 124 + .../types/fxs/3D/useWobble3D/index.d.ts | 56 + .../fxs/3D/useWobble3D/useCreateWobble3D.d.ts | 20 + .../types/fxs/3D/useWobble3D/useMaterial.d.ts | 91 + .../fxs/effects/useMotionBlur/index.d.ts | 27 + .../fxs/effects/useMotionBlur/useMesh.d.ts | 27 + .../fxs/effects/useSimpleBlur/index.d.ts | 25 + .../fxs/effects/useSimpleBlur/useMesh.d.ts | 21 + .../types/fxs/effects/useWave/index.d.ts | 28 + .../types/fxs/effects/useWave/useMesh.d.ts | 27 + .../fxs/interactions/useBrush/index.d.ts | 44 + .../fxs/interactions/useBrush/useMesh.d.ts | 72 + .../types/fxs/misc/useBlank/index.d.ts | 30 + .../types/fxs/misc/useBlank/useMesh.d.ts | 30 + .../types/fxs/misc/useChromaKey/index.d.ts | 36 + .../types/fxs/misc/useChromaKey/useMesh.d.ts | 45 + .../fxs/noises/useColorStrata/index.d.ts | 40 + .../fxs/noises/useColorStrata/useMesh.d.ts | 51 + .../types/fxs/noises/useCosPalette/index.d.ts | 30 + .../fxs/noises/useCosPalette/useMesh.d.ts | 30 + .../types/fxs/noises/useMarble/index.d.ts | 32 + .../types/fxs/noises/useMarble/useMesh.d.ts | 33 + .../types/fxs/noises/useNoise/index.d.ts | 36 + .../types/fxs/noises/useNoise/useMesh.d.ts | 36 + .../types/fxs/simulations/useFluid/index.d.ts | 59 + .../materials/useAdvectionMaterial.d.ts | 22 + .../useFluid/materials/useClearMaterial.d.ts | 16 + .../useFluid/materials/useCurlMaterial.d.ts | 13 + .../materials/useDivergenceMaterial.d.ts | 13 + .../useGradientSubtractMaterial.d.ts | 16 + .../materials/useInitialMaterial.d.ts | 2 + .../materials/usePressureMaterial.d.ts | 16 + .../useFluid/materials/useSplatMaterial.d.ts | 25 + .../materials/useVorticityMaterial.d.ts | 22 + .../fxs/simulations/useFluid/useMesh.d.ts | 53 + .../fxs/simulations/useRipple/index.d.ts | 39 + .../fxs/simulations/useRipple/useMesh.d.ts | 10 + .../use-shader-fx/types/fxs/types/index.d.ts | 57 + .../fxs/utils/useAlphaBlending/index.d.ts | 22 + .../fxs/utils/useAlphaBlending/useMesh.d.ts | 20 + .../types/fxs/utils/useBlending/index.d.ts | 36 + .../types/fxs/utils/useBlending/useMesh.d.ts | 42 + .../fxs/utils/useBrightnessPicker/index.d.ts | 26 + .../utils/useBrightnessPicker/useMesh.d.ts | 24 + .../fxs/utils/useCoverTexture/index.d.ts | 20 + .../fxs/utils/useCoverTexture/useMesh.d.ts | 24 + .../types/fxs/utils/useDuoTone/index.d.ts | 25 + .../types/fxs/utils/useDuoTone/useMesh.d.ts | 21 + .../types/fxs/utils/useFxBlending/index.d.ts | 25 + .../fxs/utils/useFxBlending/useMesh.d.ts | 21 + .../types/fxs/utils/useFxTexture/index.d.ts | 36 + .../types/fxs/utils/useFxTexture/useMesh.d.ts | 51 + .../types/fxs/utils/useHSV/index.d.ts | 24 + .../types/fxs/utils/useHSV/useMesh.d.ts | 23 + packages/use-shader-fx/types/index.d.ts | 37 + .../use-shader-fx/types/libs/constants.d.ts | 8 + packages/use-shader-fx/types/libs/easing.d.ts | 9 + .../types/libs/shaders/resolveShaders.d.ts | 2 + .../use-shader-fx/types/misc/useBeat.d.ts | 14 + .../types/misc/useCopyTexture.d.ts | 17 + .../types/misc/useDomSyncer/index.d.ts | 45 + .../misc/useDomSyncer/utils/createMesh.d.ts | 25 + .../useDomSyncer/utils/createUseDomView.d.ts | 6 + .../misc/useDomSyncer/utils/errorHandler.d.ts | 2 + .../utils/useIntersectionHandler.d.ts | 6 + .../useDomSyncer/utils/useIsIntersecting.d.ts | 7 + .../useDomSyncer/utils/useUpdateDomRect.d.ts | 16 + .../types/misc/useFPSLimiter.d.ts | 14 + .../use-shader-fx/types/misc/usePointer.d.ts | 16 + .../use-shader-fx/types/utils/getDpr.d.ts | 5 + .../types/utils/setOnBeforeCompile.d.ts | 4 + .../types/utils/setUniforms.d.ts | 17 + .../use-shader-fx/types/utils/useAddMesh.d.ts | 3 + .../types/utils/useAddObject.d.ts | 7 + .../use-shader-fx/types/utils/useCamera.d.ts | 3 + .../types/utils/useDoubleFBO.d.ts | 26 + .../use-shader-fx/types/utils/useParams.d.ts | 7 + .../types/utils/useResolution.d.ts | 6 + .../types/utils/useSingleFBO.d.ts | 39 + 97 files changed, 8582 insertions(+), 13 deletions(-) create mode 100644 packages/use-shader-fx/build/use-shader-fx.js create mode 100644 packages/use-shader-fx/build/use-shader-fx.js.map create mode 100644 packages/use-shader-fx/build/use-shader-fx.umd.cjs create mode 100644 packages/use-shader-fx/build/use-shader-fx.umd.cjs.map create mode 100644 packages/use-shader-fx/types/fxs/3D/types/index.d.ts create mode 100644 packages/use-shader-fx/types/fxs/3D/useMorphParticles/index.d.ts create mode 100644 packages/use-shader-fx/types/fxs/3D/useMorphParticles/useCreateMorphParticles.d.ts create mode 100644 packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/modifyAttributes.d.ts create mode 100644 packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/rewriteFragmentShader.d.ts create mode 100644 packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/rewriteVertexShader.d.ts create mode 100644 packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/useCreateObject.d.ts create mode 100644 packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/useMaterial.d.ts create mode 100644 packages/use-shader-fx/types/fxs/3D/useWobble3D/index.d.ts create mode 100644 packages/use-shader-fx/types/fxs/3D/useWobble3D/useCreateWobble3D.d.ts create mode 100644 packages/use-shader-fx/types/fxs/3D/useWobble3D/useMaterial.d.ts create mode 100644 packages/use-shader-fx/types/fxs/effects/useMotionBlur/index.d.ts create mode 100644 packages/use-shader-fx/types/fxs/effects/useMotionBlur/useMesh.d.ts create mode 100644 packages/use-shader-fx/types/fxs/effects/useSimpleBlur/index.d.ts create mode 100644 packages/use-shader-fx/types/fxs/effects/useSimpleBlur/useMesh.d.ts create mode 100644 packages/use-shader-fx/types/fxs/effects/useWave/index.d.ts create mode 100644 packages/use-shader-fx/types/fxs/effects/useWave/useMesh.d.ts create mode 100644 packages/use-shader-fx/types/fxs/interactions/useBrush/index.d.ts create mode 100644 packages/use-shader-fx/types/fxs/interactions/useBrush/useMesh.d.ts create mode 100644 packages/use-shader-fx/types/fxs/misc/useBlank/index.d.ts create mode 100644 packages/use-shader-fx/types/fxs/misc/useBlank/useMesh.d.ts create mode 100644 packages/use-shader-fx/types/fxs/misc/useChromaKey/index.d.ts create mode 100644 packages/use-shader-fx/types/fxs/misc/useChromaKey/useMesh.d.ts create mode 100644 packages/use-shader-fx/types/fxs/noises/useColorStrata/index.d.ts create mode 100644 packages/use-shader-fx/types/fxs/noises/useColorStrata/useMesh.d.ts create mode 100644 packages/use-shader-fx/types/fxs/noises/useCosPalette/index.d.ts create mode 100644 packages/use-shader-fx/types/fxs/noises/useCosPalette/useMesh.d.ts create mode 100644 packages/use-shader-fx/types/fxs/noises/useMarble/index.d.ts create mode 100644 packages/use-shader-fx/types/fxs/noises/useMarble/useMesh.d.ts create mode 100644 packages/use-shader-fx/types/fxs/noises/useNoise/index.d.ts create mode 100644 packages/use-shader-fx/types/fxs/noises/useNoise/useMesh.d.ts create mode 100644 packages/use-shader-fx/types/fxs/simulations/useFluid/index.d.ts create mode 100644 packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useAdvectionMaterial.d.ts create mode 100644 packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useClearMaterial.d.ts create mode 100644 packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useCurlMaterial.d.ts create mode 100644 packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useDivergenceMaterial.d.ts create mode 100644 packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useGradientSubtractMaterial.d.ts create mode 100644 packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useInitialMaterial.d.ts create mode 100644 packages/use-shader-fx/types/fxs/simulations/useFluid/materials/usePressureMaterial.d.ts create mode 100644 packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useSplatMaterial.d.ts create mode 100644 packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useVorticityMaterial.d.ts create mode 100644 packages/use-shader-fx/types/fxs/simulations/useFluid/useMesh.d.ts create mode 100644 packages/use-shader-fx/types/fxs/simulations/useRipple/index.d.ts create mode 100644 packages/use-shader-fx/types/fxs/simulations/useRipple/useMesh.d.ts create mode 100644 packages/use-shader-fx/types/fxs/types/index.d.ts create mode 100644 packages/use-shader-fx/types/fxs/utils/useAlphaBlending/index.d.ts create mode 100644 packages/use-shader-fx/types/fxs/utils/useAlphaBlending/useMesh.d.ts create mode 100644 packages/use-shader-fx/types/fxs/utils/useBlending/index.d.ts create mode 100644 packages/use-shader-fx/types/fxs/utils/useBlending/useMesh.d.ts create mode 100644 packages/use-shader-fx/types/fxs/utils/useBrightnessPicker/index.d.ts create mode 100644 packages/use-shader-fx/types/fxs/utils/useBrightnessPicker/useMesh.d.ts create mode 100644 packages/use-shader-fx/types/fxs/utils/useCoverTexture/index.d.ts create mode 100644 packages/use-shader-fx/types/fxs/utils/useCoverTexture/useMesh.d.ts create mode 100644 packages/use-shader-fx/types/fxs/utils/useDuoTone/index.d.ts create mode 100644 packages/use-shader-fx/types/fxs/utils/useDuoTone/useMesh.d.ts create mode 100644 packages/use-shader-fx/types/fxs/utils/useFxBlending/index.d.ts create mode 100644 packages/use-shader-fx/types/fxs/utils/useFxBlending/useMesh.d.ts create mode 100644 packages/use-shader-fx/types/fxs/utils/useFxTexture/index.d.ts create mode 100644 packages/use-shader-fx/types/fxs/utils/useFxTexture/useMesh.d.ts create mode 100644 packages/use-shader-fx/types/fxs/utils/useHSV/index.d.ts create mode 100644 packages/use-shader-fx/types/fxs/utils/useHSV/useMesh.d.ts create mode 100644 packages/use-shader-fx/types/index.d.ts create mode 100644 packages/use-shader-fx/types/libs/constants.d.ts create mode 100644 packages/use-shader-fx/types/libs/easing.d.ts create mode 100644 packages/use-shader-fx/types/libs/shaders/resolveShaders.d.ts create mode 100644 packages/use-shader-fx/types/misc/useBeat.d.ts create mode 100644 packages/use-shader-fx/types/misc/useCopyTexture.d.ts create mode 100644 packages/use-shader-fx/types/misc/useDomSyncer/index.d.ts create mode 100644 packages/use-shader-fx/types/misc/useDomSyncer/utils/createMesh.d.ts create mode 100644 packages/use-shader-fx/types/misc/useDomSyncer/utils/createUseDomView.d.ts create mode 100644 packages/use-shader-fx/types/misc/useDomSyncer/utils/errorHandler.d.ts create mode 100644 packages/use-shader-fx/types/misc/useDomSyncer/utils/useIntersectionHandler.d.ts create mode 100644 packages/use-shader-fx/types/misc/useDomSyncer/utils/useIsIntersecting.d.ts create mode 100644 packages/use-shader-fx/types/misc/useDomSyncer/utils/useUpdateDomRect.d.ts create mode 100644 packages/use-shader-fx/types/misc/useFPSLimiter.d.ts create mode 100644 packages/use-shader-fx/types/misc/usePointer.d.ts create mode 100644 packages/use-shader-fx/types/utils/getDpr.d.ts create mode 100644 packages/use-shader-fx/types/utils/setOnBeforeCompile.d.ts create mode 100644 packages/use-shader-fx/types/utils/setUniforms.d.ts create mode 100644 packages/use-shader-fx/types/utils/useAddMesh.d.ts create mode 100644 packages/use-shader-fx/types/utils/useAddObject.d.ts create mode 100644 packages/use-shader-fx/types/utils/useCamera.d.ts create mode 100644 packages/use-shader-fx/types/utils/useDoubleFBO.d.ts create mode 100644 packages/use-shader-fx/types/utils/useParams.d.ts create mode 100644 packages/use-shader-fx/types/utils/useResolution.d.ts create mode 100644 packages/use-shader-fx/types/utils/useSingleFBO.d.ts diff --git a/packages/use-shader-fx/build/use-shader-fx.js b/packages/use-shader-fx/build/use-shader-fx.js new file mode 100644 index 00000000..4895662b --- /dev/null +++ b/packages/use-shader-fx/build/use-shader-fx.js @@ -0,0 +1,4727 @@ +import * as a from "three"; +import { BufferAttribute as De } from "three"; +import { useMemo as b, useEffect as ae, useRef as L, useCallback as D, useState as Ee } from "react"; +var Le = "#usf ", $e = `precision highp float; + +uniform sampler2D uBuffer; +uniform sampler2D uTexture; +uniform bool uIsTexture; +uniform sampler2D uMap; +uniform bool uIsMap; +uniform float uMapIntensity; +uniform float uRadius; +uniform float uDissipation; +uniform vec2 uResolution; +uniform float uSmudge; +uniform vec2 uMouse; +uniform vec2 uPrevMouse; +uniform vec2 uVelocity; +uniform vec3 uColor; +uniform float uMotionBlur; +uniform int uMotionSample; +uniform bool uIsCursor; +uniform float uPressureStart; +uniform float uPressureEnd; + +varying vec2 vUv; + +float isOnLine(vec2 point, vec2 start, vec2 end, float radius, float pressureStart, float pressureEnd) { + + float aspect = uResolution.x / uResolution.y; + + point.x *= aspect; + start.x *= aspect; + end.x *= aspect; + + vec2 dir = normalize(end - start); + vec2 n = vec2(dir.y, -dir.x); + vec2 p0 = point - start; + + float distToLine = abs(dot(p0, n)); + float distAlongLine = dot(p0, dir); + float totalLength = length(end - start); + + float progress = clamp(distAlongLine / totalLength, 0.0, 1.0); + float pressure = mix(pressureStart, pressureEnd, progress); + radius = min(radius,radius * pressure); + + float distFromStart = length(point - start); + float distFromEnd = length(point - end); + + bool withinLine = (distToLine < radius && distAlongLine > 0.0 && distAlongLine < totalLength) || distFromStart < radius || distFromEnd < radius; + + return float(withinLine); +} + +vec4 createSmudge(vec2 uv){ + vec2 offsets[9]; + offsets[0] = vec2(-1, -1); offsets[1] = vec2( 0, -1); offsets[2] = vec2( 1, -1); + offsets[3] = vec2(-1, 0); offsets[4] = vec2( 0, 0); offsets[5] = vec2( 1, 0); + offsets[6] = vec2(-1, 1); offsets[7] = vec2( 0, 1); offsets[8] = vec2( 1, 1); + + for(int i = 0; i < 9; i++) { + offsets[i] = (offsets[i] * uSmudge) / uResolution; + } + vec4 smudgedColor = vec4(0.); + for(int i = 0; i < 9; i++) { + smudgedColor += texture2D(uBuffer, uv + offsets[i]); + } + return smudgedColor / 9.0; +} + +vec4 createMotionBlur(vec2 uv , vec4 baseColor, vec2 velocity) { + vec2 scaledV = velocity * uMotionBlur; + for(int i = 1; i < uMotionSample; i++) { + float t = float(i) / float(uMotionSample - 1); + vec2 offset = t * scaledV / uResolution; + baseColor += texture2D(uBuffer, uv + offset); + } + return baseColor / float(uMotionSample); +} + +void main() { + + vec2 uv = vUv; + if(uIsMap){ + vec2 mapColor = texture2D(uMap, uv).rg; + vec2 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; + } + vec2 suv = uv*2.-1.; + + vec2 velocity = uVelocity * uResolution; + + float radius = max(0.0,uRadius); + + vec4 smudgedColor = uSmudge > 0. ? createSmudge(uv) : texture2D(uBuffer, uv); + + vec4 motionBlurredColor = uMotionBlur > 0. ? createMotionBlur(uv,smudgedColor, velocity) : smudgedColor; + + vec4 bufferColor = motionBlurredColor; + bufferColor.a = bufferColor.a < 1e-10 ? 0.0 : bufferColor.a * uDissipation; + + vec4 brushColor = uIsTexture ? texture2D(uTexture, uv) : vec4(uColor,1.); + + float onLine = isOnLine(suv, uPrevMouse, uMouse, radius, uPressureStart,uPressureEnd); + float isOnLine = length(velocity) > 0. ? onLine : uIsCursor ? onLine : 0.; + + vec4 finalColor = mix(bufferColor, brushColor, isOnLine); + + gl_FragColor = finalColor; +}`; +const Y = (e, t = !1) => { + const n = t ? e.width * t : e.width, r = t ? e.height * t : e.height; + return b( + () => new a.Vector2(n, r), + [n, r] + ); +}, A = (e) => (t, n) => { + if (n === void 0) + return; + const r = e.uniforms; + r && r[t] && (r[t].value = n); +}, z = (e) => (t) => { + t !== void 0 && Object.keys(t).forEach((n) => { + const r = e.uniforms; + r && r[n] && (r[n].value = t[n]); + }); +}, $ = (e, t, n, r) => { + const i = b(() => { + const v = new r(t, n); + return e && e.add(v), v; + }, [t, n, r, e]); + return ae(() => () => { + e && e.remove(i), t.dispose(), n.dispose(); + }, [e, t, n, i]), i; +}, Ie = process.env.NODE_ENV === "development", B = { + transparent: !1, + depthTest: !1, + depthWrite: !1 +}, T = 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);} +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;} + +vec4 grad4(float j, vec4 ip) +{ + const vec4 ones = vec4(1.0, 1.0, 1.0, -1.0); + vec4 p,s; + + p.xyz = floor( fract (vec3(j) * ip.xyz) * 7.0) * ip.z - 1.0; + p.w = 1.5 - dot(abs(p.xyz), ones.xyz); + s = vec4(lessThan(p, vec4(0.0))); + p.xyz = p.xyz + (s.xyz*2.0 - 1.0) * s.www; + + return p; +} + +float simplexNoise4d(vec4 v) +{ + const vec2 C = vec2( 0.138196601125010504, + 0.309016994374947451); + + vec4 i = floor(v + dot(v, C.yyyy) ); + vec4 x0 = v - i + dot(i, C.xxxx); + + + + + vec4 i0; + + vec3 isX = step( x0.yzw, x0.xxx ); + vec3 isYZ = step( x0.zww, x0.yyz ); + + i0.x = isX.x + isX.y + isX.z; + i0.yzw = 1.0 - isX; + + + i0.y += isYZ.x + isYZ.y; + i0.zw += 1.0 - isYZ.xy; + + i0.z += isYZ.z; + i0.w += 1.0 - isYZ.z; + + + vec4 i3 = clamp( i0, 0.0, 1.0 ); + vec4 i2 = clamp( i0-1.0, 0.0, 1.0 ); + vec4 i1 = clamp( i0-2.0, 0.0, 1.0 ); + + + vec4 x1 = x0 - i1 + 1.0 * C.xxxx; + vec4 x2 = x0 - i2 + 2.0 * C.xxxx; + vec4 x3 = x0 - i3 + 3.0 * C.xxxx; + vec4 x4 = x0 - 1.0 + 4.0 * C.xxxx; + + + i = mod(i, 289.0); + float j0 = permute( permute( permute( permute(i.w) + i.z) + i.y) + i.x); + vec4 j1 = permute( permute( permute( permute ( + i.w + vec4(i1.w, i2.w, i3.w, 1.0 )) + + i.z + vec4(i1.z, i2.z, i3.z, 1.0 )) + + i.y + vec4(i1.y, i2.y, i3.y, 1.0 )) + + i.x + vec4(i1.x, i2.x, i3.x, 1.0 )); + + + + + vec4 ip = vec4(1.0/294.0, 1.0/49.0, 1.0/7.0, 0.0) ; + + vec4 p0 = grad4(j0, ip); + vec4 p1 = grad4(j1.x, ip); + vec4 p2 = grad4(j1.y, ip); + vec4 p3 = grad4(j1.z, ip); + vec4 p4 = grad4(j1.w, ip); + + + vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3))); + p0 *= norm.x; + p1 *= norm.y; + p2 *= norm.z; + p3 *= norm.w; + p4 *= taylorInvSqrt(dot(p4,p4)); + + + vec3 m0 = max(0.6 - vec3(dot(x0,x0), dot(x1,x1), dot(x2,x2)), 0.0); + vec2 m1 = max(0.6 - vec2(dot(x3,x3), dot(x4,x4) ), 0.0); + m0 = m0 * m0; + m1 = m1 * m1; + return 49.0 * ( dot(m0*m0, vec3( dot( p0, x0 ), dot( p1, x1 ), dot( p2, x2 ))) + + dot(m1*m1, vec2( dot( p3, x3 ), dot( p4, x4 ) ) ) ) ; + +} + +float getWobble(vec3 position) +{ + vec3 warpedPosition = position; + warpedPosition += simplexNoise4d( + vec4( + position * uWarpPositionFrequency, + uTime * uWarpTimeFrequency + ) + ) * uWarpStrength; + + return simplexNoise4d(vec4( + warpedPosition * uWobblePositionFrequency, + uTime * uWobbleTimeFrequency + )) * uWobbleStrength; +}`, qe = `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); + j *= .125; + r.x = fract(512.0*j); + j *= .125; + r.y = fract(512.0*j); + return r-0.5; +} + +const float F3 = 0.3333333; +const float G3 = 0.1666667; + +float snoise(vec3 p) { + + vec3 s = floor(p + dot(p, vec3(F3))); + vec3 x = p - s + dot(s, vec3(G3)); + + vec3 e = step(vec3(0.0), x - x.yzx); + vec3 i1 = e*(1.0 - e.zxy); + vec3 i2 = 1.0 - e.zxy*(1.0 - e); + + vec3 x1 = x - i1 + G3; + vec3 x2 = x - i2 + 2.0*G3; + vec3 x3 = x - 1.0 + 3.0*G3; + + vec4 w, d; + + w.x = dot(x, x); + w.y = dot(x1, x1); + w.z = dot(x2, x2); + w.w = dot(x3, x3); + + w = max(0.6 - w, 0.0); + + d.x = dot(random3(s), x); + d.y = dot(random3(s + i1), x1); + d.z = dot(random3(s + i2), x2); + d.w = dot(random3(s + 1.0), x3); + + w *= w; + w *= w; + d *= w; + + return dot(d, vec4(52.0)); +} + +float snoiseFractal(vec3 m) { + return 0.5333333* snoise(m) + +0.2666667* snoise(2.0*m) + +0.1333333* snoise(4.0*m) + +0.0666667* snoise(8.0*m); +}`, 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;`, 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;`, ke = `precision highp float; + +varying vec2 vUv; + +void main() { + vUv = uv; + gl_Position = vec4(position, 1.0); +}`; +const Ge = { + wobble3D: je, + snoise: qe, + coverTexture: We, + fxBlending: Ne, + planeVert: ke +}, Ke = /^[ \t]*#usf +<([\w\d./]+)>/gm; +function Xe(e, t) { + let n = Ge[t] || ""; + return be(n); +} +function be(e) { + return e.replace(Ke, Xe); +} +const He = (e) => { + e.vertexShader = be(e.vertexShader), e.fragmentShader = be(e.fragmentShader); +}, V = (e) => (t, n) => { + e && e(t, n), He(t); +}, Ye = ({ + scene: e, + size: t, + dpr: n, + uniforms: r, + onBeforeCompile: i +}) => { + const v = b(() => new a.PlaneGeometry(2, 2), []), s = b(() => { + const d = new a.ShaderMaterial({ + uniforms: { + uBuffer: { value: T }, + uResolution: { value: new a.Vector2(0, 0) }, + uTexture: { value: T }, + uIsTexture: { value: !1 }, + uMap: { value: T }, + uIsMap: { value: !1 }, + 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: ne.color }, + uIsCursor: { value: !1 }, + uPressureStart: { value: 1 }, + uPressureEnd: { value: 1 }, + ...r + }, + vertexShader: Le, + fragmentShader: $e, + ...B, + // Must be transparent + transparent: !0 + }); + return d.onBeforeCompile = V(i), d; + }, [i, r]), u = Y(t, n); + A(s)("uResolution", u.clone()); + const c = $(e, v, s, a.Mesh); + return { material: s, mesh: c }; +}, Qe = (e, t) => { + const n = t, r = e / t, [i, v] = [n * r / 2, n / 2]; + return { width: i, height: v, near: -1e3, far: 1e3 }; +}, j = (e, t = "OrthographicCamera") => { + const n = Y(e), { width: r, height: i, near: v, far: s } = Qe( + n.x, + n.y + ); + return b(() => t === "OrthographicCamera" ? new a.OrthographicCamera( + -r, + r, + i, + -i, + v, + s + ) : new a.PerspectiveCamera(50, r / i), [r, i, v, s, t]); +}, _e = (e = 0) => { + const t = L(new a.Vector2(0, 0)), n = L(new a.Vector2(0, 0)), r = L(new a.Vector2(0, 0)), i = L(0), v = L(new a.Vector2(0, 0)), s = L(!1); + return D( + (c) => { + const d = performance.now(); + let f; + s.current && e ? (r.current = r.current.lerp( + c, + 1 - e + ), f = r.current.clone()) : (f = c.clone(), r.current = f), i.current === 0 && (i.current = d, t.current = f); + const y = Math.max(1, d - i.current); + i.current = d, v.current.copy(f).sub(t.current).divideScalar(y); + const x = v.current.length() > 0, o = s.current ? t.current.clone() : f; + return !s.current && x && (s.current = !0), t.current = f, { + currentPointer: f, + prevPointer: o, + diffPointer: n.current.subVectors(f, o), + velocity: v.current, + isVelocityUpdate: x + }; + }, + [e] + ); +}, q = (e) => { + const n = L( + ((i) => Object.values(i).some((v) => typeof v == "function"))(e) ? e : structuredClone(e) + ), r = D((i) => { + if (i !== void 0) + for (const v in i) { + const s = v; + s in n.current && i[s] !== void 0 && i[s] !== null ? n.current[s] = i[s] : console.error( + `"${String( + s + )}" does not exist in the params. or "${String( + s + )}" is null | undefined` + ); + } + }, []); + return [n.current, r]; +}, he = { + minFilter: a.LinearFilter, + magFilter: a.LinearFilter, + type: a.HalfFloatType, + stencilBuffer: !1 +}, Ce = ({ + gl: e, + fbo: t, + scene: n, + camera: r, + onBeforeRender: i, + onSwap: v +}) => { + e.setRenderTarget(t), i(), e.clear(), e.render(n, r), v && v(), e.setRenderTarget(null), e.clear(); +}, W = ({ + scene: e, + camera: t, + size: n, + dpr: r = !1, + isSizeUpdate: i = !1, + samples: v = 0, + depthBuffer: s = !1, + depthTexture: u = !1 +}) => { + var y; + const c = L(), d = Y(n, r); + c.current = b( + () => { + const x = new a.WebGLRenderTarget( + d.x, + d.y, + { + ...he, + samples: v, + depthBuffer: s + } + ); + return u && (x.depthTexture = new a.DepthTexture( + d.x, + d.y, + a.FloatType + )), x; + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [] + ), i && ((y = c.current) == null || y.setSize(d.x, d.y)), ae(() => { + const x = c.current; + return () => { + x == null || x.dispose(); + }; + }, []); + const f = D( + (x, o) => { + const g = c.current; + return Ce({ + gl: x, + fbo: g, + scene: e, + camera: t, + onBeforeRender: () => o && o({ read: g.texture }) + }), g.texture; + }, + [e, t] + ); + return [c.current, f]; +}, se = ({ + scene: e, + camera: t, + size: n, + dpr: r = !1, + isSizeUpdate: i = !1, + samples: v = 0, + depthBuffer: s = !1, + depthTexture: u = !1 +}) => { + var x, o; + const c = L({ + read: null, + write: null, + swap: function() { + let g = this.read; + this.read = this.write, this.write = g; + } + }), d = Y(n, r), f = b(() => { + const g = new a.WebGLRenderTarget(d.x, d.y, { + ...he, + samples: v, + depthBuffer: s + }), l = new a.WebGLRenderTarget(d.x, d.y, { + ...he, + samples: v, + depthBuffer: s + }); + return u && (g.depthTexture = new a.DepthTexture( + d.x, + d.y, + a.FloatType + ), l.depthTexture = new a.DepthTexture( + d.x, + d.y, + a.FloatType + )), { read: g, write: l }; + }, []); + c.current.read = f.read, c.current.write = f.write, i && ((x = c.current.read) == null || x.setSize(d.x, d.y), (o = c.current.write) == null || o.setSize(d.x, d.y)), ae(() => { + const g = c.current; + return () => { + var l, p; + (l = g.read) == null || l.dispose(), (p = g.write) == null || p.dispose(); + }; + }, []); + const y = D( + (g, l) => { + var m; + const p = c.current; + return Ce({ + gl: g, + scene: e, + camera: t, + fbo: p.write, + onBeforeRender: () => l && l({ + read: p.read.texture, + write: p.write.texture + }), + onSwap: () => p.swap() + }), (m = p.read) == null ? void 0 : m.texture; + }, + [e, t] + ); + return [ + { read: c.current.read, write: c.current.write }, + y + ]; +}, U = (e) => typeof e == "number" ? { shader: e, fbo: e } : { + shader: e.shader ?? !1, + fbo: e.fbo ?? !1 +}, ne = Object.freeze({ + texture: !1, + map: !1, + mapIntensity: 0.1, + radius: 0.05, + smudge: 0, + dissipation: 1, + motionBlur: 0, + motionSample: 5, + color: new a.Vector3(1, 0, 0), + isCursor: !1, + pressure: 1, + pointerValues: !1 +}), Gn = ({ + size: e, + dpr: t, + samples: n, + isSizeUpdate: r, + uniforms: i, + onBeforeCompile: v +}) => { + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = Ye({ + scene: u, + size: e, + dpr: s.shader, + uniforms: i, + onBeforeCompile: v + }), f = j(e), y = _e(), [x, o] = se({ + scene: u, + camera: f, + size: e, + dpr: s.fbo, + samples: n, + isSizeUpdate: r + }), [g, l] = q(ne), p = L(null), m = A(c), C = z(c), M = D( + (S, _) => { + l(S), C(_); + }, + [l, C] + ); + return [ + D( + (S, _, w) => { + const { gl: I, pointer: R } = S; + M(_, w), g.texture ? (m("uIsTexture", !0), m("uTexture", g.texture)) : m("uIsTexture", !1), g.map ? (m("uIsMap", !0), m("uMap", g.map), m("uMapIntensity", g.mapIntensity)) : m("uIsMap", !1), m("uRadius", g.radius), m("uSmudge", g.smudge), m("uDissipation", g.dissipation), m("uMotionBlur", g.motionBlur), m("uMotionSample", g.motionSample); + const F = g.pointerValues || y(R); + F.isVelocityUpdate && (m("uMouse", F.currentPointer), m("uPrevMouse", F.prevPointer)), m("uVelocity", F.velocity); + const P = typeof g.color == "function" ? g.color(F.velocity) : g.color; + return m("uColor", P), m("uIsCursor", g.isCursor), m("uPressureEnd", g.pressure), p.current === null && (p.current = g.pressure), m("uPressureStart", p.current), p.current = g.pressure, o(I, ({ read: O }) => { + m("uBuffer", O); + }); + }, + [m, y, o, g, M] + ), + M, + { + scene: u, + mesh: d, + material: c, + camera: f, + renderTarget: x, + output: x.read.texture + } + ]; +}; +var ee = `varying vec2 vUv; +varying vec2 vL; +varying vec2 vR; +varying vec2 vT; +varying vec2 vB; +uniform vec2 texelSize; + +void main () { + vUv = uv; + vL = vUv - vec2(texelSize.x, 0.0); + vR = vUv + vec2(texelSize.x, 0.0); + vT = vUv + vec2(0.0, texelSize.y); + vB = vUv - vec2(0.0, texelSize.y); + gl_Position = vec4(position, 1.0); +}`, Ze = `precision highp float; + +void main(){ + gl_FragColor = vec4(0.0); +}`; +const Je = () => b(() => new a.ShaderMaterial({ + vertexShader: ee, + fragmentShader: Ze, + ...B +}), []); +var et = `precision highp float; + +varying vec2 vUv; +uniform sampler2D uVelocity; +uniform sampler2D uSource; +uniform vec2 texelSize; +uniform float dt; +uniform float dissipation; + +void main () { + vec2 coord = vUv - dt * texture2D(uVelocity, vUv).xy * texelSize; + gl_FragColor = vec4(dissipation * texture2D(uSource, coord).rgb,1.); +}`; +const tt = ({ + onBeforeCompile: e, + uniforms: t +}) => b(() => { + const r = new a.ShaderMaterial({ + uniforms: { + uVelocity: { value: T }, + uSource: { value: T }, + texelSize: { value: new a.Vector2() }, + dt: { value: Fe }, + dissipation: { value: 0 }, + ...t + }, + vertexShader: ee, + fragmentShader: et, + ...B + }); + return r.onBeforeCompile = V(e), r; +}, [e, t]); +var nt = `precision highp float; + +varying vec2 vUv; +varying vec2 vL; +varying vec2 vR; +varying vec2 vT; +varying vec2 vB; +uniform sampler2D uVelocity; + +vec2 sampleVelocity(in vec2 uv) { + vec2 clampedUV = clamp(uv, 0.0, 1.0); + vec2 multiplier = vec2(1.0, 1.0); + multiplier.x = uv.x < 0.0 || uv.x > 1.0 ? -1.0 : 1.0; + multiplier.y = uv.y < 0.0 || uv.y > 1.0 ? -1.0 : 1.0; + return multiplier * texture2D(uVelocity, clampedUV).xy; +} + +void main () { + float L = sampleVelocity(vL).x; + float R = sampleVelocity(vR).x; + float T = sampleVelocity(vT).y; + float B = sampleVelocity(vB).y; + float div = 0.5 * (R - L + T - B); + gl_FragColor = vec4(div, 0.0, 0.0, 1.0); +}`; +const rt = ({ + onBeforeCompile: e, + uniforms: t +}) => b(() => { + const r = new a.ShaderMaterial({ + uniforms: { + uVelocity: { value: null }, + texelSize: { value: new a.Vector2() }, + ...t + }, + vertexShader: ee, + fragmentShader: nt, + ...B + }); + return r.onBeforeCompile = V(e), r; +}, [e, t]); +var ot = `precision highp float; + +varying vec2 vUv; +varying vec2 vL; +varying vec2 vR; +varying vec2 vT; +varying vec2 vB; +uniform sampler2D uPressure; +uniform sampler2D uDivergence; + +void main () { + float L = texture2D(uPressure, clamp(vL,0.,1.)).x; + float R = texture2D(uPressure, clamp(vR,0.,1.)).x; + float T = texture2D(uPressure, clamp(vT,0.,1.)).x; + float B = texture2D(uPressure, clamp(vB,0.,1.)).x; + float C = texture2D(uPressure, vUv).x; + 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 at = ({ + onBeforeCompile: e, + uniforms: t +}) => b(() => { + const r = new a.ShaderMaterial({ + uniforms: { + uPressure: { value: null }, + uDivergence: { value: null }, + texelSize: { value: new a.Vector2() }, + ...t + }, + vertexShader: ee, + fragmentShader: ot, + ...B + }); + return r.onBeforeCompile = V(e), r; +}, [e, t]); +var it = `precision highp float; + +varying vec2 vUv; +varying vec2 vL; +varying vec2 vR; +varying vec2 vT; +varying vec2 vB; +uniform sampler2D uVelocity; + +void main () { + float L = texture2D(uVelocity, vL).y; + float R = texture2D(uVelocity, vR).y; + float T = texture2D(uVelocity, vT).x; + float B = texture2D(uVelocity, vB).x; + float vorticity = R - L - T + B; + gl_FragColor = vec4(vorticity, 0.0, 0.0, 1.0); +}`; +const ut = ({ + onBeforeCompile: e, + uniforms: t +}) => b(() => { + const r = new a.ShaderMaterial({ + uniforms: { + uVelocity: { value: null }, + texelSize: { value: new a.Vector2() }, + ...t + }, + vertexShader: ee, + fragmentShader: it, + ...B + }); + return r.onBeforeCompile = V(e), r; +}, [e, t]); +var st = `precision highp float; + +varying vec2 vUv; +varying vec2 vT; +varying vec2 vB; +uniform sampler2D uVelocity; +uniform sampler2D uCurl; +uniform float curl; +uniform float dt; + +void main () { + float T = texture2D(uCurl, vT).x; + float B = texture2D(uCurl, vB).x; + float C = texture2D(uCurl, vUv).x; + vec2 force = vec2(abs(T) - abs(B), 0.0); + 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 lt = ({ + onBeforeCompile: e, + uniforms: t +}) => b(() => { + const r = new a.ShaderMaterial({ + uniforms: { + uVelocity: { value: null }, + uCurl: { value: null }, + curl: { value: 0 }, + dt: { value: Fe }, + texelSize: { value: new a.Vector2() }, + ...t + }, + vertexShader: ee, + fragmentShader: st, + ...B + }); + return r.onBeforeCompile = V(e), r; +}, [e, t]); +var ct = `precision highp float; + +varying vec2 vUv; +uniform sampler2D uTexture; +uniform float value; + +void main () { + gl_FragColor = value * texture2D(uTexture, vUv); +}`; +const vt = ({ + onBeforeCompile: e, + uniforms: t +}) => b(() => { + const r = new a.ShaderMaterial({ + uniforms: { + uTexture: { value: T }, + value: { value: 0 }, + texelSize: { value: new a.Vector2() }, + ...t + }, + vertexShader: ee, + fragmentShader: ct, + ...B + }); + return r.onBeforeCompile = V(e), r; +}, [e, t]); +var pt = `precision highp float; + +varying vec2 vUv; +varying vec2 vL; +varying vec2 vR; +varying vec2 vT; +varying vec2 vB; +uniform sampler2D uPressure; +uniform sampler2D uVelocity; + +void main () { + float L = texture2D(uPressure, clamp(vL,0.,1.)).x; + float R = texture2D(uPressure, clamp(vR,0.,1.)).x; + float T = texture2D(uPressure, clamp(vT,0.,1.)).x; + float B = texture2D(uPressure, clamp(vB,0.,1.)).x; + vec2 velocity = texture2D(uVelocity, vUv).xy; + velocity.xy -= vec2(R - L, T - B); + gl_FragColor = vec4(velocity, 0.0, 1.0); +}`; +const mt = ({ + onBeforeCompile: e, + uniforms: t +}) => b(() => { + const r = new a.ShaderMaterial({ + uniforms: { + uPressure: { value: T }, + uVelocity: { value: T }, + texelSize: { value: new a.Vector2() }, + ...t + }, + vertexShader: ee, + fragmentShader: pt, + ...B + }); + return r.onBeforeCompile = V(e), r; +}, [e, t]); +var ft = `precision highp float; + +varying vec2 vUv; +uniform sampler2D uTarget; +uniform float aspectRatio; +uniform vec3 color; +uniform vec2 point; +uniform float radius; + +void main () { + vec2 nPoint = (point + vec2(1.0)) * 0.5; + vec2 p = vUv - nPoint.xy; + p.x *= aspectRatio; + vec3 splat = exp(-dot(p, p) / radius) * color; + vec3 base = texture2D(uTarget, vUv).xyz; + gl_FragColor = vec4(base + splat, 1.0); +}`; +const dt = ({ + onBeforeCompile: e, + uniforms: t +}) => b(() => { + const r = new a.ShaderMaterial({ + uniforms: { + uTarget: { value: T }, + aspectRatio: { value: 0 }, + color: { value: new a.Vector3() }, + point: { value: new a.Vector2() }, + radius: { value: 0 }, + texelSize: { value: new a.Vector2() }, + ...t + }, + vertexShader: ee, + fragmentShader: ft, + ...B + }); + return r.onBeforeCompile = V(e), r; +}, [e, t]), Q = (e, t) => e(t ?? {}), gt = ({ + scene: e, + size: t, + dpr: n, + customFluidProps: r +}) => { + const i = b(() => new a.PlaneGeometry(2, 2), []), { + curl: v, + vorticity: s, + advection: u, + divergence: c, + pressure: d, + clear: f, + gradientSubtract: y, + splat: x + } = r ?? {}, o = Q(Je), g = o.clone(), l = Q(ut, v), p = Q(lt, s), m = Q(tt, u), C = Q( + rt, + c + ), M = Q(at, d), h = Q(vt, f), S = Q( + mt, + y + ), _ = Q(dt, x), w = b( + () => ({ + vorticityMaterial: p, + curlMaterial: l, + advectionMaterial: m, + divergenceMaterial: C, + pressureMaterial: M, + clearMaterial: h, + gradientSubtractMaterial: S, + splatMaterial: _ + }), + [ + p, + l, + m, + C, + M, + h, + S, + _ + ] + ), I = Y(t, n); + b(() => { + A(w.splatMaterial)( + "aspectRatio", + I.x / I.y + ); + for (const P of Object.values(w)) + A(P)( + "texelSize", + new a.Vector2(1 / I.x, 1 / I.y) + ); + }, [I, w]); + const R = $(e, i, o, a.Mesh); + b(() => { + o.dispose(), R.material = g; + }, [o, R, g]), ae(() => () => { + for (const P of Object.values(w)) + P.dispose(); + }, [w]); + const F = D( + (P) => { + R.material = P, R.material.needsUpdate = !0; + }, + [R] + ); + return { materials: w, setMeshMaterial: F, mesh: R }; +}, Fe = 0.016, ht = Object.freeze({ + density_dissipation: 0.98, + velocity_dissipation: 0.99, + velocity_acceleration: 10, + pressure_dissipation: 0.9, + pressure_iterations: 20, + curl_strength: 35, + splat_radius: 2e-3, + fluid_color: new a.Vector3(1, 1, 1), + pointerValues: !1 +}), Kn = ({ + size: e, + dpr: t, + samples: n, + isSizeUpdate: r, + customFluidProps: i +}) => { + const v = U(t), s = b(() => new a.Scene(), []), { materials: u, setMeshMaterial: c, mesh: d } = gt({ + scene: s, + size: e, + dpr: v.shader, + customFluidProps: i + }), f = j(e), y = _e(), x = b( + () => ({ + scene: s, + camera: f, + dpr: v.fbo, + size: e, + samples: n, + isSizeUpdate: r + }), + [s, f, e, n, v.fbo, r] + ), [o, g] = se(x), [l, p] = se(x), [m, C] = W(x), [M, h] = W(x), [S, _] = se(x), w = L(new a.Vector2(0, 0)), I = L(new a.Vector3(0, 0, 0)), [R, F] = q(ht), P = b( + () => ({ + 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] + ), O = b( + () => ({ + advection: z(u.advectionMaterial), + splat: z(u.splatMaterial), + curl: z(u.curlMaterial), + vorticity: z(u.vorticityMaterial), + divergence: z(u.divergenceMaterial), + clear: z(u.clearMaterial), + pressure: z(u.pressureMaterial), + gradientSubtract: z(u.gradientSubtractMaterial) + }), + [u] + ), k = D( + (H, K) => { + F(H), K && Object.keys(K).forEach((ie) => { + O[ie]( + K[ie] + ); + }); + }, + [F, O] + ); + return [ + D( + (H, K, ie) => { + const { gl: X, pointer: xe, size: we } = H; + k(K, ie); + const ye = g(X, ({ read: G }) => { + c(u.advectionMaterial), P.advection("uVelocity", G), P.advection("uSource", G), P.advection( + "dissipation", + R.velocity_dissipation + ); + }), Be = p(X, ({ read: G }) => { + c(u.advectionMaterial), P.advection("uVelocity", ye), P.advection("uSource", G), P.advection( + "dissipation", + R.density_dissipation + ); + }), me = R.pointerValues || y(xe); + me.isVelocityUpdate && (g(X, ({ read: G }) => { + c(u.splatMaterial), P.splat("uTarget", G), P.splat("point", me.currentPointer); + const le = me.diffPointer.multiply( + w.current.set(we.width, we.height).multiplyScalar(R.velocity_acceleration) + ); + P.splat( + "color", + I.current.set(le.x, le.y, 1) + ), P.splat("radius", R.splat_radius); + }), p(X, ({ read: G }) => { + c(u.splatMaterial), P.splat("uTarget", G); + const le = typeof R.fluid_color == "function" ? R.fluid_color(me.velocity) : R.fluid_color; + P.splat("color", le); + })); + const Oe = C(X, () => { + c(u.curlMaterial), P.curl("uVelocity", ye); + }); + g(X, ({ read: G }) => { + c(u.vorticityMaterial), P.vorticity("uVelocity", G), P.vorticity("uCurl", Oe), P.vorticity("curl", R.curl_strength); + }); + const Ue = h(X, () => { + c(u.divergenceMaterial), P.divergence("uVelocity", ye); + }); + _(X, ({ read: G }) => { + c(u.clearMaterial), P.clear("uTexture", G), P.clear("value", R.pressure_dissipation); + }), c(u.pressureMaterial), P.pressure("uDivergence", Ue); + let Te; + for (let G = 0; G < R.pressure_iterations; G++) + Te = _(X, ({ read: le }) => { + P.pressure("uPressure", le); + }); + return g(X, ({ read: G }) => { + c(u.gradientSubtractMaterial), P.gradientSubtract("uPressure", Te), P.gradientSubtract("uVelocity", G); + }), Be; + }, + [ + u, + P, + c, + C, + p, + h, + y, + _, + g, + R, + k + ] + ), + k, + { + scene: s, + mesh: d, + materials: u, + camera: f, + renderTarget: { + velocity: o, + density: l, + curl: m, + divergence: M, + pressure: S + }, + output: l.read.texture + } + ]; +}; +var xt = `varying vec2 vUv; + +void main() { + vUv = uv; + gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); +}`, yt = `precision highp float; + +uniform sampler2D uMap; +uniform float uOpacity; + +varying vec2 vUv; + +void main() { + vec2 uv = vUv; + vec3 color = texture2D(uMap, uv).rgb; + gl_FragColor = vec4(color,uOpacity); +}`; +const bt = ({ + scale: e, + max: t, + texture: n, + scene: r, + uniforms: i, + onBeforeCompile: v +}) => { + const s = b( + () => new a.PlaneGeometry(e, e), + [e] + ), u = b(() => new a.ShaderMaterial({ + uniforms: { + uOpacity: { value: 0 }, + uMap: { value: n || T }, + ...i + }, + blending: a.AdditiveBlending, + vertexShader: xt, + fragmentShader: yt, + ...B, + // Must be transparent. + transparent: !0 + }), [n, i]), c = b(() => { + const d = []; + for (let f = 0; f < t; f++) { + const y = u.clone(); + y.onBeforeCompile = V(v); + const x = new a.Mesh(s.clone(), y); + x.rotateZ(2 * Math.PI * Math.random()), x.visible = !1, r.add(x), d.push(x); + } + return d; + }, [v, s, u, r, t]); + return ae(() => () => { + c.forEach((d) => { + d.geometry.dispose(), Array.isArray(d.material) ? d.material.forEach((f) => f.dispose()) : d.material.dispose(), r.remove(d); + }); + }, [r, c]), c; +}, Mt = Object.freeze({ + frequency: 0.01, + rotation: 0.05, + fadeout_speed: 0.9, + scale: 0.3, + alpha: 0.6, + pointerValues: !1 +}), Xn = ({ + texture: e, + scale: t = 64, + max: n = 100, + size: r, + dpr: i, + samples: v, + isSizeUpdate: s, + uniforms: u, + onBeforeCompile: c +}) => { + const d = U(i), f = b(() => new a.Scene(), []), y = bt({ + scale: t, + max: n, + texture: e, + scene: f, + uniforms: u, + onBeforeCompile: c + }), x = j(r), o = _e(), [g, l] = W({ + scene: f, + camera: x, + size: r, + dpr: d.fbo, + samples: v, + isSizeUpdate: s + }), [p, m] = q(Mt), C = L(0), M = b(() => (S, _) => { + m(S), y.forEach((w) => { + if (w.visible) { + const I = w.material; + w.rotation.z += p.rotation, w.scale.x = p.fadeout_speed * w.scale.x + p.scale, w.scale.y = w.scale.x; + const R = I.uniforms.uOpacity.value; + A(I)( + "uOpacity", + R * p.fadeout_speed + ), R < 1e-3 && (w.visible = !1); + } + z(w.material)(_); + }); + }, [y, p, m]); + return [ + D( + (S, _, w) => { + const { gl: I, pointer: R, size: F } = S; + M(_, w); + const P = p.pointerValues || o(R); + if (p.frequency < P.diffPointer.length()) { + const O = y[C.current], k = O.material; + O.visible = !0, O.position.set( + P.currentPointer.x * (F.width / 2), + P.currentPointer.y * (F.height / 2), + 0 + ), O.scale.x = O.scale.y = 0, A(k)("uOpacity", p.alpha), C.current = (C.current + 1) % n; + } + return l(I); + }, + [l, y, o, n, p, M] + ), + M, + { + scene: f, + camera: x, + meshArr: y, + renderTarget: g, + output: g.texture + } + ]; +}; +var St = "#usf ", _t = `precision highp float; +precision highp int; + +varying vec2 vUv; +uniform float uTime; +uniform float timeStrength; +uniform int noiseOctaves; +uniform int fbmOctaves; +uniform int warpOctaves; +uniform vec2 warpDirection; +uniform float warpStrength; +uniform float scale; + +const float per = 0.5; +const float PI = 3.14159265359; + +float rnd(vec2 n) { + float a = 0.129898; + float b = 0.78233; + float c = 437.585453; + float dt= dot(n ,vec2(a, b)); + float sn= mod(dt, PI); + return fract(sin(sn) * c); +} + +float interpolate(float a, float b, float x){ + float f = (1.0 - cos(x * PI)) * 0.5; + return a * (1.0 - f) + b * f; +} + +float irnd(vec2 p){ + vec2 i = floor(p); + vec2 f = fract(p); + vec4 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))); + return interpolate(interpolate(v.x, v.y, f.x), interpolate(v.z, v.w, f.x), f.y); +} + +float noise(vec2 p, float time){ + float t = 0.0; + for(int i = 0; i < noiseOctaves; i++){ + float freq = pow(2.0, float(i)); + float amp = pow(per, float(noiseOctaves - i)); + t += irnd(vec2(p.y / freq + time, p.x / freq + time)) * amp; + } + return t; +} + +float fbm(vec2 x, float time) { + float v = 0.0; + float a = 0.5; + vec2 shift = vec2(100); + mat2 rot = mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.5)); + float sign = 1.0; + for (int i = 0; i < fbmOctaves; ++i) { + v += a * noise(x, time * sign); + x = rot * x * 2.0 + shift; + a *= 0.5; + sign *= -1.0; + } + return v; +} + +float warp(vec2 x, float g,float time){ + float val = 0.0; + for (int i = 0; i < warpOctaves; i++){ + val = fbm(x + g * vec2(cos(warpDirection.x * val), sin(warpDirection.y * val)), time); + } + return val; +} + +void main() { + float noise = warp(gl_FragCoord.xy * scale ,warpStrength,uTime * timeStrength); + gl_FragColor = vec4(vec3(noise),1.0); +}`; +const Ct = ({ + scene: e, + uniforms: t, + onBeforeCompile: n +}) => { + const r = b(() => new a.PlaneGeometry(2, 2), []), i = b(() => { + const s = new a.ShaderMaterial({ + uniforms: { + uTime: { value: 0 }, + 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 }, + ...t + }, + vertexShader: St, + fragmentShader: _t, + ...B + }); + return s.onBeforeCompile = V(n), s; + }, [n, t]), v = $(e, r, i, a.Mesh); + return { material: i, mesh: v }; +}, re = Object.freeze({ + scale: 4e-3, + timeStrength: 0.3, + noiseOctaves: 2, + fbmOctaves: 2, + warpOctaves: 2, + warpDirection: new a.Vector2(2, 2), + warpStrength: 8, + beat: !1 +}), Hn = ({ + size: e, + dpr: t, + samples: n, + isSizeUpdate: r, + uniforms: i, + onBeforeCompile: v +}) => { + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = Ct({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), [y, x] = W({ + scene: u, + camera: f, + size: e, + dpr: s.fbo, + samples: n, + isSizeUpdate: r + }), [o, g] = q(re), l = A(c), p = z(c), m = D( + (M, h) => { + g(M), p(h); + }, + [g, p] + ); + return [ + D( + (M, h, S) => { + const { gl: _, clock: w } = M; + return m(h, 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 || w.getElapsedTime()), x(_); + }, + [x, l, o, m] + ), + m, + { + scene: u, + mesh: d, + material: c, + camera: f, + renderTarget: y, + output: y.texture + } + ]; +}; +var wt = "#usf ", Tt = `precision highp float; +varying vec2 vUv; + +uniform sampler2D uTexture; +uniform bool isTexture; +uniform sampler2D noise; +uniform bool isNoise; +uniform vec2 noiseStrength; +uniform float laminateLayer; +uniform vec2 laminateInterval; +uniform vec2 laminateDetail; +uniform vec2 distortion; +uniform vec3 colorFactor; +uniform float uTime; +uniform vec2 timeStrength; +uniform float scale; + +void main() { + vec2 uv = vUv; + + vec2 pos = isTexture ? texture2D(uTexture, uv).rg : uv * scale; + vec2 noise = isNoise ? texture2D(noise, uv).rg : vec2(0.0); + float alpha = isTexture ? texture2D(uTexture, uv).a : 1.0; + + + alpha = (alpha < 1e-10) ? 0.0 : alpha; + + vec3 col; + for(float j = 0.0; j < 3.0; j++){ + for(float i = 1.0; i < laminateLayer; i++){ + float timeNoiseSin = sin(uTime / (i + j)) * timeStrength.x + noise.r * noiseStrength.x; + float timeNoiseCos = cos(uTime / (i + j)) * timeStrength.y + noise.g * noiseStrength.y; + pos.x += laminateInterval.x / (i + j) * cos(i * distortion.x * pos.y + timeNoiseSin + sin(i + j)); + pos.y += laminateInterval.y / (i + j) * cos(i * distortion.y * pos.x + timeNoiseCos + sin(i + j)); + } + col[int(j)] = sin(pow(pos.x, 2.) * pow(laminateDetail.x, 2.)) + sin(pow(pos.y, 2.) * pow(laminateDetail.y, 2.)); + } + + col *= colorFactor * alpha; + col = clamp(col, 0.0, 1.0); + + gl_FragColor = vec4(col, alpha); +}`; +const Dt = ({ + scene: e, + uniforms: t, + onBeforeCompile: n +}) => { + const r = b(() => new a.PlaneGeometry(2, 2), []), i = b(() => { + const s = new a.ShaderMaterial({ + uniforms: { + uTexture: { value: T }, + isTexture: { value: !1 }, + scale: { value: Z.scale }, + noise: { value: T }, + noiseStrength: { value: Z.noiseStrength }, + isNoise: { value: !1 }, + laminateLayer: { value: Z.laminateLayer }, + laminateInterval: { value: Z.laminateInterval }, + laminateDetail: { value: Z.laminateDetail }, + distortion: { value: Z.distortion }, + colorFactor: { value: Z.colorFactor }, + uTime: { value: 0 }, + timeStrength: { value: Z.timeStrength }, + ...t + }, + vertexShader: wt, + fragmentShader: Tt, + ...B + }); + return s.onBeforeCompile = V(n), s; + }, [n, t]), v = $(e, r, i, a.Mesh); + return { material: i, mesh: v }; +}, Z = Object.freeze({ + texture: !1, + scale: 1, + laminateLayer: 1, + laminateInterval: new a.Vector2(0.1, 0.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 +}), Yn = ({ + size: e, + dpr: t, + samples: n, + isSizeUpdate: r, + uniforms: i, + onBeforeCompile: v +}) => { + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = Dt({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), [y, x] = W({ + scene: u, + camera: f, + size: e, + dpr: s.fbo, + samples: n, + isSizeUpdate: r + }), [o, g] = q(Z), l = A(c), p = z(c), m = D( + (M, h) => { + g(M), p(h); + }, + [g, p] + ); + return [ + D( + (M, h, S) => { + const { gl: _, clock: w } = M; + return m(h, 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 || w.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), x(_); + }, + [x, l, o, m] + ), + m, + { + scene: u, + mesh: d, + material: c, + camera: f, + renderTarget: y, + output: y.texture + } + ]; +}; +var Pt = "#usf ", Rt = `precision highp float; + +varying vec2 vUv; +uniform float u_time; +uniform float u_pattern; +uniform float u_complexity; +uniform float u_complexityAttenuation; +uniform float u_iterations; +uniform float u_timeStrength; +uniform float u_scale; + +vec3 marble(vec3 p){ + vec4 n; + for(float i;i { + const r = b(() => new a.PlaneGeometry(2, 2), []), i = b(() => { + const s = new a.ShaderMaterial({ + uniforms: { + u_time: { value: 0 }, + u_pattern: { value: ue.pattern }, + u_complexity: { value: ue.complexity }, + u_complexityAttenuation: { + value: ue.complexityAttenuation + }, + u_iterations: { value: ue.iterations }, + u_timeStrength: { value: ue.timeStrength }, + u_scale: { value: ue.scale }, + ...t + }, + vertexShader: Pt, + fragmentShader: Rt, + ...B + }); + return s.onBeforeCompile = V(n), s; + }, [n, t]), v = $(e, r, i, a.Mesh); + return { material: i, mesh: v }; +}, ue = Object.freeze({ + pattern: 0, + complexity: 2, + complexityAttenuation: 0.2, + iterations: 8, + timeStrength: 0.2, + scale: 2e-3, + beat: !1 +}), Qn = ({ + size: e, + dpr: t, + samples: n, + isSizeUpdate: r, + uniforms: i, + onBeforeCompile: v +}) => { + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = At({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), [y, x] = W({ + scene: u, + camera: f, + size: e, + dpr: s.fbo, + samples: n, + isSizeUpdate: r + }), [o, g] = q(ue), l = A(c), p = z(c), m = D( + (M, h) => { + g(M), p(h); + }, + [g, p] + ); + return [ + D( + (M, h, S) => { + const { gl: _, clock: w } = M; + return m(h, 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 || w.getElapsedTime()), x(_); + }, + [x, l, o, m] + ), + m, + { + scene: u, + mesh: d, + material: c, + camera: f, + renderTarget: y, + output: y.texture + } + ]; +}; +var It = "#usf ", Ft = `precision highp float; +precision highp int; + +varying vec2 vUv; +uniform sampler2D uTexture; +uniform vec3 uColor1; +uniform vec3 uColor2; +uniform vec3 uColor3; +uniform vec3 uColor4; +uniform vec3 uRgbWeight; + +vec3 cosPalette( float t, vec3 color1, vec3 color2, vec3 color3, vec3 color4 ){ + return color1 + color2 * cos( 6.28318 * ( color3 * t + color4) ); +} + +void main() { + + vec4 tex = texture2D(uTexture, vUv); + float gray = dot(tex.rgb, uRgbWeight); + + vec3 outColor = cosPalette( + gray, + uColor1, + uColor2, + uColor3, + uColor4 + ); + + gl_FragColor = vec4(outColor, tex.a); +}`; +const Vt = ({ + scene: e, + uniforms: t, + onBeforeCompile: n +}) => { + const r = b(() => new a.PlaneGeometry(2, 2), []), i = b(() => { + const s = new a.ShaderMaterial({ + uniforms: { + uTexture: { value: T }, + uRgbWeight: { value: ce.rgbWeight }, + uColor1: { value: ce.color1 }, + uColor2: { value: ce.color2 }, + uColor3: { value: ce.color3 }, + uColor4: { value: ce.color4 }, + ...t + }, + vertexShader: It, + fragmentShader: Ft, + ...B + }); + return s.onBeforeCompile = V(n), s; + }, [n, t]), v = $(e, r, i, a.Mesh); + return { material: i, mesh: v }; +}, ce = Object.freeze({ + texture: T, + 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) +}), Zn = ({ + size: e, + dpr: t, + samples: n, + isSizeUpdate: r, + uniforms: i, + onBeforeCompile: v +}) => { + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = Vt({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), [y, x] = W({ + scene: u, + camera: f, + size: e, + dpr: s.fbo, + samples: n, + isSizeUpdate: r + }), [o, g] = q(ce), l = A(c), p = z(c), m = D( + (M, h) => { + g(M), p(h); + }, + [g, p] + ); + return [ + D( + (M, h, S) => { + const { gl: _ } = M; + return m(h, 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), x(_); + }, + [x, l, o, m] + ), + m, + { + scene: u, + mesh: d, + material: c, + camera: f, + renderTarget: y, + output: y.texture + } + ]; +}; +var zt = "#usf ", Bt = `precision highp float; + +varying vec2 vUv; +uniform sampler2D uTexture; + +uniform vec3 uColor0; +uniform vec3 uColor1; + +void main() { + vec2 uv = vUv; + vec4 texColor = texture2D(uTexture, uv); + 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 Ot = ({ + scene: e, + uniforms: t, + onBeforeCompile: n +}) => { + const r = b(() => new a.PlaneGeometry(2, 2), []), i = b(() => { + const s = new a.ShaderMaterial({ + uniforms: { + uTexture: { value: T }, + uColor0: { value: Me.color0 }, + uColor1: { value: Me.color1 }, + ...t + }, + vertexShader: zt, + fragmentShader: Bt, + ...B + }); + return s.onBeforeCompile = V(n), s; + }, [n, t]), v = $(e, r, i, a.Mesh); + return { material: i, mesh: v }; +}, Me = Object.freeze({ + texture: T, + color0: new a.Color(16777215), + color1: new a.Color(0) +}), Jn = ({ + size: e, + dpr: t, + samples: n, + isSizeUpdate: r, + uniforms: i, + onBeforeCompile: v +}) => { + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = Ot({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), [y, x] = W({ + scene: u, + camera: f, + size: e, + dpr: s.fbo, + samples: n, + isSizeUpdate: r + }), [o, g] = q(Me), l = A(c), p = z(c), m = D( + (M, h) => { + g(M), p(h); + }, + [g, p] + ); + return [ + D( + (M, h, S) => { + const { gl: _ } = M; + return m(h, S), l("uTexture", o.texture), l("uColor0", o.color0), l("uColor1", o.color1), x(_); + }, + [x, l, o, m] + ), + m, + { + scene: u, + mesh: d, + material: c, + camera: f, + renderTarget: y, + output: y.texture + } + ]; +}; +var Ut = "#usf ", Et = `precision highp float; + +varying vec2 vUv; +uniform sampler2D u_texture; +uniform sampler2D uMap; +uniform bool u_isAlphaMap; +uniform sampler2D u_alphaMap; +uniform float uMapIntensity; +uniform vec3 u_brightness; +uniform float u_min; +uniform float u_max; +uniform vec3 u_dodgeColor; +uniform bool u_isDodgeColor; + +void main() { + vec2 uv = vUv; + + #usf + + + float brightness = dot(mapColor,u_brightness); + vec4 textureMap = texture2D(u_texture, uv); + float blendValue = smoothstep(u_min, u_max, brightness); + + + vec3 dodgeColor = u_isDodgeColor ? u_dodgeColor : mapColor; + vec3 outputColor = blendValue * dodgeColor + (1.0 - blendValue) * textureMap.rgb; + + + float alpha = u_isAlphaMap ? texture2D(u_alphaMap, uv).a : textureMap.a; + float mixValue = u_isAlphaMap ? alpha : 0.0; + vec3 alphaColor = vec3(mix(outputColor,mapColor,mixValue)); + + gl_FragColor = vec4(alphaColor,alpha); +}`; +const Lt = ({ + scene: e, + uniforms: t, + onBeforeCompile: n +}) => { + const r = b(() => new a.PlaneGeometry(2, 2), []), i = b(() => { + const s = new a.ShaderMaterial({ + uniforms: { + u_texture: { value: T }, + uMap: { value: T }, + u_alphaMap: { value: T }, + u_isAlphaMap: { value: !1 }, + 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 }, + ...t + }, + vertexShader: Ut, + fragmentShader: Et, + ...B + }); + return s.onBeforeCompile = V(n), s; + }, [n, t]), v = $(e, r, i, a.Mesh); + return { material: i, mesh: v }; +}, ve = Object.freeze({ + texture: T, + map: T, + alphaMap: !1, + mapIntensity: 0.3, + brightness: new a.Vector3(0.5, 0.5, 0.5), + min: 0, + max: 1, + dodgeColor: !1 +}), er = ({ + size: e, + dpr: t, + samples: n, + isSizeUpdate: r, + uniforms: i, + onBeforeCompile: v +}) => { + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = Lt({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), [y, x] = W({ + scene: u, + camera: f, + size: e, + dpr: s.fbo, + samples: n, + isSizeUpdate: r + }), [o, g] = q(ve), l = A(c), p = z(c), m = D( + (M, h) => { + g(M), p(h); + }, + [g, p] + ); + return [ + D( + (M, h, S) => { + const { gl: _ } = M; + return m(h, 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), x(_); + }, + [x, l, o, m] + ), + m, + { + scene: u, + mesh: d, + material: c, + camera: f, + renderTarget: y, + output: y.texture + } + ]; +}; +var $t = "#usf ", jt = `precision highp float; + +varying vec2 vUv; +uniform vec2 uResolution; +uniform vec2 uTextureResolution; +uniform sampler2D uTexture0; +uniform sampler2D uTexture1; +uniform sampler2D uMap; +uniform float mapIntensity; +uniform float edgeIntensity; +uniform float progress; +uniform float dirX; +uniform float dirY; +uniform vec2 epicenter; +uniform float padding; + +bool isInPaddingArea(vec2 uv) { + return uv.x < padding || uv.x > 1.0 - padding || uv.y < padding || uv.y > 1.0 - padding; +} + +void main() { + #usf + + + vec2 map = texture2D(uMap, uv).rg; + vec2 normalizedMap = map * 2.0 - 1.0; + + + uv = uv * 2.0 - 1.0; + uv *= map * distance(epicenter, uv) * edgeIntensity + 1.0; + uv = (uv + 1.0) / 2.0; + + + if (isInPaddingArea(uv)) { + gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0); + return; + } + vec2 paddedUV = uv * (1.0 - 2.0 * padding * -1.) + padding * -1.; + + + vec2 centeredUV = paddedUV - vec2(0.5); + + + centeredUV *= normalizedMap * map * mapIntensity + 1.0; + + + float xOffsetTexture0 = 0.5 - dirX * progress; + float yOffsetTexture0 = 0.5 - dirY * progress; + vec2 samplePosTexture0 = vec2(xOffsetTexture0, yOffsetTexture0) + centeredUV; + + + float xOffsetTexture1 = 0.5 + dirX * (1.0 - progress); + float yOffsetTexture1 = 0.5 + dirY * (1.0 - progress); + vec2 samplePosTexture1 = vec2(xOffsetTexture1, yOffsetTexture1) + centeredUV; + + vec4 color0 = texture2D(uTexture0, samplePosTexture0); + vec4 color1 = texture2D(uTexture1, samplePosTexture1); + + gl_FragColor = mix(color0, color1, progress); + +}`; +const qt = ({ + scene: e, + size: t, + dpr: n, + uniforms: r, + onBeforeCompile: i +}) => { + const v = b(() => new a.PlaneGeometry(2, 2), []), s = b(() => { + var f, y; + const d = new a.ShaderMaterial({ + uniforms: { + uResolution: { value: new a.Vector2() }, + uTextureResolution: { value: new a.Vector2() }, + uTexture0: { value: T }, + uTexture1: { value: T }, + padding: { value: oe.padding }, + uMap: { value: T }, + edgeIntensity: { value: oe.edgeIntensity }, + mapIntensity: { value: oe.mapIntensity }, + epicenter: { value: oe.epicenter }, + progress: { value: oe.progress }, + dirX: { value: (f = oe.dir) == null ? void 0 : f.x }, + dirY: { value: (y = oe.dir) == null ? void 0 : y.y }, + ...r + }, + vertexShader: $t, + fragmentShader: jt, + ...B + }); + return d.onBeforeCompile = V(i), d; + }, [i, r]), u = Y(t, n); + A(s)("uResolution", u.clone()); + const c = $(e, v, s, a.Mesh); + return { material: s, mesh: c }; +}, oe = Object.freeze({ + texture0: T, + texture1: T, + padding: 0, + map: T, + mapIntensity: 0, + edgeIntensity: 0, + epicenter: new a.Vector2(0, 0), + progress: 0, + dir: new a.Vector2(0, 0) +}), tr = ({ + size: e, + dpr: t, + samples: n, + isSizeUpdate: r, + uniforms: i, + onBeforeCompile: v +}) => { + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = qt({ + scene: u, + size: e, + dpr: s.shader, + uniforms: i, + onBeforeCompile: v + }), f = j(e), [y, x] = W({ + scene: u, + camera: f, + dpr: s.fbo, + size: e, + samples: n, + isSizeUpdate: r + }), [o, g] = q(oe), l = A(c), p = z(c), m = D( + (M, h) => { + g(M), p(h); + }, + [g, p] + ); + return [ + D( + (M, h, S) => { + var F, P, O, k, te, H, K, ie; + const { gl: _ } = M; + m(h, S), l("uTexture0", o.texture0), l("uTexture1", o.texture1), l("progress", o.progress); + const w = [ + ((P = (F = o.texture0) == null ? void 0 : F.image) == null ? void 0 : P.width) || 0, + ((k = (O = o.texture0) == null ? void 0 : O.image) == null ? void 0 : k.height) || 0 + ], I = [ + ((H = (te = o.texture1) == null ? void 0 : te.image) == null ? void 0 : H.width) || 0, + ((ie = (K = o.texture1) == null ? void 0 : K.image) == null ? void 0 : ie.height) || 0 + ], R = w.map((X, xe) => X + (I[xe] - X) * o.progress); + return l("uTextureResolution", R), 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), x(_); + }, + [x, l, o, m] + ), + m, + { + scene: u, + mesh: d, + material: c, + camera: f, + renderTarget: y, + output: y.texture + } + ]; +}; +var Wt = "#usf ", Nt = `precision highp float; + +varying vec2 vUv; +uniform sampler2D u_texture; +uniform vec3 u_brightness; +uniform float u_min; +uniform float u_max; + +void main() { + vec2 uv = vUv; + vec3 color = texture2D(u_texture, uv).rgb; + 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 kt = ({ + scene: e, + uniforms: t, + onBeforeCompile: n +}) => { + const r = b(() => new a.PlaneGeometry(2, 2), []), i = b(() => { + const s = new a.ShaderMaterial({ + uniforms: { + u_texture: { value: T }, + u_brightness: { value: fe.brightness }, + u_min: { value: fe.min }, + u_max: { value: fe.max }, + ...t + }, + vertexShader: Wt, + fragmentShader: Nt, + ...B + }); + return s.onBeforeCompile = V(n), s; + }, [n, t]), v = $(e, r, i, a.Mesh); + return { material: i, mesh: v }; +}, fe = Object.freeze({ + texture: T, + brightness: new a.Vector3(0.5, 0.5, 0.5), + min: 0, + max: 1 +}), nr = ({ + size: e, + dpr: t, + samples: n, + isSizeUpdate: r, + uniforms: i, + onBeforeCompile: v +}) => { + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = kt({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), [y, x] = W({ + scene: u, + camera: f, + size: e, + dpr: s.fbo, + samples: n, + isSizeUpdate: r + }), [o, g] = q( + fe + ), l = A(c), p = z(c), m = D( + (M, h) => { + g(M), p(h); + }, + [g, p] + ); + return [ + D( + (M, h, S) => { + const { gl: _ } = M; + return m(h, S), l("u_texture", o.texture), l("u_brightness", o.brightness), l("u_min", o.min), l("u_max", o.max), x(_); + }, + [x, l, o, m] + ), + m, + { + scene: u, + mesh: d, + material: c, + camera: f, + renderTarget: y, + output: y.texture + } + ]; +}; +var Gt = "#usf ", Kt = `precision highp float; + +varying vec2 vUv; +uniform sampler2D u_texture; +uniform sampler2D uMap; +uniform float uMapIntensity; + +void main() { + vec2 uv = vUv; + + #usf + + gl_FragColor = texture2D(u_texture, uv); +}`; +const Xt = ({ + scene: e, + uniforms: t, + onBeforeCompile: n +}) => { + const r = b(() => new a.PlaneGeometry(2, 2), []), i = b(() => { + const s = new a.ShaderMaterial({ + uniforms: { + u_texture: { value: T }, + uMap: { value: T }, + uMapIntensity: { value: Ve.mapIntensity }, + ...t + }, + vertexShader: Gt, + fragmentShader: Kt, + ...B + }); + return s.onBeforeCompile = V(n), s; + }, [n, t]), v = $(e, r, i, a.Mesh); + return { material: i, mesh: v }; +}, Ve = Object.freeze({ + texture: T, + map: T, + mapIntensity: 0.3 +}), rr = ({ + size: e, + dpr: t, + samples: n, + isSizeUpdate: r, + uniforms: i, + onBeforeCompile: v +}) => { + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = Xt({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), [y, x] = W({ + scene: u, + camera: f, + size: e, + dpr: s.fbo, + samples: n, + isSizeUpdate: r + }), [o, g] = q(Ve), l = A(c), p = z(c), m = D( + (M, h) => { + g(M), p(h); + }, + [g, p] + ); + return [ + D( + (M, h, S) => { + const { gl: _ } = M; + return m(h, S), l("u_texture", o.texture), l("uMap", o.map), l("uMapIntensity", o.mapIntensity), x(_); + }, + [x, l, o, m] + ), + m, + { + scene: u, + mesh: d, + material: c, + camera: f, + renderTarget: y, + output: y.texture + } + ]; +}; +var Ht = "#usf ", Yt = `precision highp float; + +uniform sampler2D uTexture; +uniform sampler2D uMap; + +varying vec2 vUv; + +void main() { + vec2 uv = vUv; + vec4 tex = texture2D(uTexture, uv); + vec4 map = texture2D(uMap, uv); + gl_FragColor = mix(tex,map,map.a); +}`; +const Qt = ({ + scene: e, + uniforms: t, + onBeforeCompile: n +}) => { + const r = b(() => new a.PlaneGeometry(2, 2), []), i = b(() => { + const s = new a.ShaderMaterial({ + uniforms: { + uTexture: { value: T }, + uMap: { value: T }, + ...t + }, + vertexShader: Ht, + fragmentShader: Yt, + ...B + }); + return s.onBeforeCompile = V(n), s; + }, [n, t]), v = $(e, r, i, a.Mesh); + return { material: i, mesh: v }; +}, Zt = Object.freeze({ + texture: T, + map: T +}), or = ({ + size: e, + dpr: t, + samples: n, + isSizeUpdate: r, + uniforms: i, + onBeforeCompile: v +}) => { + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = Qt({ + scene: u, + size: e, + uniforms: i, + onBeforeCompile: v + }), f = j(e), [y, x] = W({ + scene: u, + camera: f, + size: e, + dpr: s.fbo, + samples: n, + isSizeUpdate: r + }), [o, g] = q(Zt), l = A(c), p = z(c), m = D( + (M, h) => { + g(M), p(h); + }, + [g, p] + ); + return [ + D( + (M, h, S) => { + const { gl: _ } = M; + return m(h, S), l("uTexture", o.texture), l("uMap", o.map), x(_); + }, + [l, x, o, m] + ), + m, + { + scene: u, + mesh: d, + material: c, + camera: f, + renderTarget: y, + output: y.texture + } + ]; +}; +var Jt = "#usf ", en = `precision highp float; + +varying vec2 vUv; +uniform sampler2D u_texture; +uniform float u_brightness; +uniform float u_saturation; + +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)); + vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); + + 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); +} + +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); +} + +void main() { + vec4 tex = texture2D(u_texture, vUv); + vec3 hsv = rgb2hsv(tex.rgb); + hsv.y *= u_saturation; + hsv.z *= u_brightness; + vec3 final = hsv2rgb(hsv); + gl_FragColor = vec4(final, tex.a); +}`; +const tn = ({ + scene: e, + uniforms: t, + onBeforeCompile: n +}) => { + const r = b(() => new a.PlaneGeometry(2, 2), []), i = b(() => { + const s = new a.ShaderMaterial({ + uniforms: { + u_texture: { value: T }, + u_brightness: { value: Se.brightness }, + u_saturation: { value: Se.saturation }, + ...t + }, + vertexShader: Jt, + fragmentShader: en, + ...B + }); + return s.onBeforeCompile = V(n), s; + }, [n, t]), v = $(e, r, i, a.Mesh); + return { material: i, mesh: v }; +}, Se = Object.freeze({ + texture: T, + brightness: 1, + saturation: 1 +}), ar = ({ + size: e, + dpr: t, + samples: n, + isSizeUpdate: r, + uniforms: i, + onBeforeCompile: v +}) => { + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = tn({ + scene: u, + size: e, + uniforms: i, + onBeforeCompile: v + }), f = j(e), [y, x] = W({ + scene: u, + camera: f, + size: e, + dpr: s.fbo, + samples: n, + isSizeUpdate: r + }), [o, g] = q(Se), l = A(c), p = z(c), m = D( + (M, h) => { + g(M), p(h); + }, + [g, p] + ); + return [ + D( + (M, h, S) => { + const { gl: _ } = M; + return m(h, S), l("u_texture", o.texture), l("u_brightness", o.brightness), l("u_saturation", o.saturation), x(_); + }, + [l, x, o, m] + ), + m, + { + scene: u, + mesh: d, + material: c, + camera: f, + renderTarget: y, + output: y.texture + } + ]; +}; +var nn = "#usf ", rn = `precision highp float; + +varying vec2 vUv; +uniform vec2 uResolution; +uniform vec2 uTextureResolution; +uniform sampler2D uTexture; + +void main() { + #usf + + gl_FragColor = texture2D(uTexture, uv); +}`; +const on = ({ + scene: e, + size: t, + dpr: n, + uniforms: r, + onBeforeCompile: i +}) => { + const v = b(() => new a.PlaneGeometry(2, 2), []), s = b(() => { + const d = new a.ShaderMaterial({ + uniforms: { + uResolution: { value: new a.Vector2() }, + uTextureResolution: { value: new a.Vector2() }, + uTexture: { value: T }, + ...r + }, + vertexShader: nn, + fragmentShader: rn, + ...B + }); + return d.onBeforeCompile = V(i), d; + }, [i, r]), u = Y(t, n); + A(s)("uResolution", u.clone()); + const c = $(e, v, s, a.Mesh); + return { material: s, mesh: c }; +}, an = Object.freeze({ + texture: T +}), ir = ({ + size: e, + dpr: t, + samples: n, + isSizeUpdate: r, + uniforms: i, + onBeforeCompile: v +}) => { + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = on({ + scene: u, + size: e, + dpr: s.shader, + uniforms: i, + onBeforeCompile: v + }), f = j(e), [y, x] = W({ + scene: u, + camera: f, + dpr: s.fbo, + size: e, + samples: n, + isSizeUpdate: r + }), [o, g] = q(an), l = A(c), p = z(c), m = D( + (M, h) => { + g(M), p(h); + }, + [g, p] + ); + return [ + D( + (M, h, S) => { + var w, I, R, F, P, O; + const { gl: _ } = M; + return m(h, S), l("uTexture", o.texture), l("uTextureResolution", [ + ((R = (I = (w = o.texture) == null ? void 0 : w.source) == null ? void 0 : I.data) == null ? void 0 : R.width) || 0, + ((O = (P = (F = o.texture) == null ? void 0 : F.source) == null ? void 0 : P.data) == null ? void 0 : O.height) || 0 + ]), x(_); + }, + [x, l, o, m] + ), + m, + { + scene: u, + mesh: d, + material: c, + camera: f, + renderTarget: y, + output: y.texture + } + ]; +}; +var un = "#usf ", sn = `precision highp float; + +varying vec2 vUv; +uniform sampler2D uTexture; +uniform vec2 uResolution; +uniform float uBlurSize; + +void main() { + vec2 uv = vUv; + vec2 perDivSize = uBlurSize / uResolution; + + + vec4 outColor = vec4( + texture2D(uTexture, uv + perDivSize * vec2(-1.0, -1.0)) + + texture2D(uTexture, uv + perDivSize * vec2(0.0, -1.0)) + + texture2D(uTexture, uv + perDivSize * vec2(1.0, -1.0)) + + texture2D(uTexture, uv + perDivSize * vec2(-1.0, 0.0)) + + texture2D(uTexture, uv + perDivSize * vec2(0.0, 0.0)) + + texture2D(uTexture, uv + perDivSize * vec2(1.0, 0.0)) + + texture2D(uTexture, uv + perDivSize * vec2(-1.0, 1.0)) + + texture2D(uTexture, uv + perDivSize * vec2(0.0, 1.0)) + + texture2D(uTexture, uv + perDivSize * vec2(1.0, 1.0)) + ) / 9.0; + + gl_FragColor = outColor; +}`; +const ln = ({ + scene: e, + uniforms: t, + onBeforeCompile: n +}) => { + const r = b(() => new a.PlaneGeometry(2, 2), []), i = b(() => { + const s = new a.ShaderMaterial({ + uniforms: { + uTexture: { value: T }, + uResolution: { value: new a.Vector2(0, 0) }, + uBlurSize: { value: ze.blurSize }, + ...t + }, + vertexShader: un, + fragmentShader: sn, + ...B + }); + return s.onBeforeCompile = V(n), s; + }, [n, t]), v = $(e, r, i, a.Mesh); + return { material: i, mesh: v }; +}, ze = Object.freeze({ + texture: T, + blurSize: 3, + blurPower: 5 +}), ur = ({ + size: e, + dpr: t, + samples: n, + isSizeUpdate: r, + uniforms: i, + onBeforeCompile: v +}) => { + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = ln({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), y = b( + () => ({ + scene: u, + camera: f, + size: e, + dpr: s.fbo, + samples: n, + isSizeUpdate: r + }), + [u, f, e, s.fbo, n, r] + ), [x, o] = se(y), [g, l] = q(ze), p = A(c), m = z(c), C = D( + (h, S) => { + l(h), m(S); + }, + [l, m] + ); + return [ + D( + (h, S, _) => { + var F, P, O, k, te, H; + const { gl: w } = h; + C(S, _), p("uTexture", g.texture), p("uResolution", [ + ((O = (P = (F = g.texture) == null ? void 0 : F.source) == null ? void 0 : P.data) == null ? void 0 : O.width) || 0, + ((H = (te = (k = g.texture) == null ? void 0 : k.source) == null ? void 0 : te.data) == null ? void 0 : H.height) || 0 + ]), p("uBlurSize", g.blurSize); + let I = o(w); + const R = g.blurPower; + for (let K = 0; K < R; K++) + p("uTexture", I), I = o(w); + return I; + }, + [o, p, g, C] + ), + C, + { + scene: u, + mesh: d, + material: c, + camera: f, + renderTarget: x, + output: x.read.texture + } + ]; +}; +var cn = "#usf ", vn = `precision highp float; + +varying vec2 vUv; +uniform sampler2D uTexture; +uniform sampler2D uBackbuffer; +uniform vec2 uBegin; +uniform vec2 uEnd; +uniform float uStrength; + +void main() { + vec2 uv = vUv; + vec4 current = texture2D(uTexture, uv + uBegin*.1); + vec4 back = texture2D(uBackbuffer, uv + uEnd*.1); + vec4 mixed = mix(current,back,uStrength); + gl_FragColor = mixed; +}`; +const pn = ({ + scene: e, + uniforms: t, + onBeforeCompile: n +}) => { + const r = b(() => new a.PlaneGeometry(2, 2), []), i = b(() => { + const s = new a.ShaderMaterial({ + uniforms: { + uTexture: { value: T }, + uBackbuffer: { value: T }, + uBegin: { value: de.begin }, + uEnd: { value: de.end }, + uStrength: { value: de.strength }, + ...t + }, + vertexShader: cn, + fragmentShader: vn, + ...B + }); + return s.onBeforeCompile = V(n), s; + }, [n, t]), v = $(e, r, i, a.Mesh); + return { material: i, mesh: v }; +}, de = Object.freeze({ + texture: T, + begin: new a.Vector2(0, 0), + end: new a.Vector2(0, 0), + strength: 0.9 +}), sr = ({ + size: e, + dpr: t, + samples: n, + isSizeUpdate: r, + uniforms: i, + onBeforeCompile: v +}) => { + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = pn({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), y = b( + () => ({ + scene: u, + camera: f, + size: e, + dpr: s.fbo, + samples: n, + isSizeUpdate: r + }), + [u, f, e, s.fbo, n, r] + ), [x, o] = se(y), [g, l] = q(de), p = A(c), m = z(c), C = D( + (h, S) => { + l(h), m(S); + }, + [l, m] + ); + return [ + D( + (h, S, _) => { + const { gl: w } = h; + return C(S, _), p("uTexture", g.texture), p("uBegin", g.begin), p("uEnd", g.end), p("uStrength", g.strength), o(w, ({ read: I }) => { + p("uBackbuffer", I); + }); + }, + [o, p, C, g] + ), + C, + { + scene: u, + mesh: d, + material: c, + camera: f, + renderTarget: x, + output: x.read.texture + } + ]; +}; +var mn = "#usf ", fn = `precision highp float; + +varying vec2 vUv; +uniform float uProgress; +uniform float uStrength; +uniform float uWidth; +uniform vec2 uEpicenter; +uniform int uMode; + +float PI = 3.141592653589; + +void main() { + + vec2 uv = vUv; + + float progress = min(uProgress, 1.0); + float progressFactor = sin(progress * PI); + + float border = progress - progress * progressFactor * uWidth; + float blur = uStrength * progressFactor; + + + vec2 normalizeCenter = (uEpicenter + 1.0) / 2.0; + + + float dist = uMode == 0 ? length(uv - normalizeCenter) : uMode == 1 ? length(uv.x - normalizeCenter.x) : length(uv.y - normalizeCenter.y); + + + float maxDistance = max( + length(vec2(0.0, 0.0) - normalizeCenter), + max( + length(vec2(1.0, 0.0) - normalizeCenter), + max( + length(vec2(0.0, 1.0) - normalizeCenter), + length(vec2(1.0, 1.0) - normalizeCenter) + ) + ) + ); + + + dist = maxDistance > 0.0 ? dist / maxDistance : dist; + + vec3 color = vec3(smoothstep(border - blur, border, dist) - + smoothstep(progress, progress + blur, dist)); + + + color *= progressFactor; + + gl_FragColor = vec4(color, 1.0); +}`; +const dn = ({ + scene: e, + uniforms: t, + onBeforeCompile: n +}) => { + const r = b(() => new a.PlaneGeometry(2, 2), []), i = b(() => { + const s = new a.ShaderMaterial({ + uniforms: { + uEpicenter: { value: pe.epicenter }, + uProgress: { value: pe.progress }, + uStrength: { value: pe.strength }, + uWidth: { value: pe.width }, + uMode: { value: 0 }, + ...t + }, + vertexShader: mn, + fragmentShader: fn, + ...B + }); + return s.onBeforeCompile = V(n), s; + }, [n, t]), v = $(e, r, i, a.Mesh); + return { material: i, mesh: v }; +}, pe = Object.freeze({ + epicenter: new a.Vector2(0, 0), + progress: 0, + width: 0, + strength: 0, + mode: "center" +}), lr = ({ + size: e, + dpr: t, + samples: n, + isSizeUpdate: r, + uniforms: i, + onBeforeCompile: v +}) => { + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = dn({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), [y, x] = W({ + scene: u, + camera: f, + size: e, + dpr: s.fbo, + samples: n, + isSizeUpdate: r + }), [o, g] = q(pe), l = A(c), p = z(c), m = D( + (M, h) => { + g(M), p(h); + }, + [g, p] + ); + return [ + D( + (M, h, S) => { + const { gl: _ } = M; + return m(h, 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 + ), x(_); + }, + [x, l, o, m] + ), + m, + { + scene: u, + mesh: d, + material: c, + camera: f, + renderTarget: y, + output: y.texture + } + ]; +}; +var gn = "#usf ", hn = `precision highp float; +varying vec2 vUv; + +uniform sampler2D u_texture; +uniform vec2 u_resolution; +uniform vec3 u_keyColor; +uniform float u_similarity; +uniform float u_smoothness; +uniform float u_spill; + +uniform vec4 u_color; +uniform float u_contrast; +uniform float u_brightness; +uniform float u_gamma; + +vec2 RGBtoUV(vec3 rgb) { + return vec2( + rgb.r * -0.169 + rgb.g * -0.331 + rgb.b * 0.5 + 0.5, + rgb.r * 0.5 + rgb.g * -0.419 + rgb.b * -0.081 + 0.5 + ); +} +float getChromeDist(vec3 texColor){ + float chromaDist = distance(RGBtoUV(texColor), RGBtoUV(u_keyColor)); + return chromaDist; +} + +float getBoxFilteredChromaDist(vec3 rgb, vec2 uv) +{ + vec2 pixel_size = vec2(1.) / u_resolution; + vec2 h_pixel_size = pixel_size / 2.0; + vec2 point_0 = vec2(pixel_size.x, h_pixel_size.y); + vec2 point_1 = vec2(h_pixel_size.x, -pixel_size.y); + float distVal = getChromeDist(texture2D(u_texture,uv-point_0).rgb); + distVal += getChromeDist(texture2D(u_texture,uv+point_0).rgb); + distVal += getChromeDist(texture2D(u_texture,uv-point_1).rgb); + distVal += getChromeDist(texture2D(u_texture,uv+point_1).rgb); + distVal *= 2.0; + distVal += getChromeDist(rgb); + return distVal / 9.0; +} + +vec4 CalcColor(vec4 rgba) +{ + return vec4(pow(rgba.rgb, vec3(u_gamma, u_gamma, u_gamma)) * u_contrast + u_brightness, rgba.a); +} + +void main() { + + vec2 uv = vUv; + + vec4 texColor = texture2D(u_texture, uv); + texColor.rgb *= (texColor.a > 0.) ? (1. / texColor.a) : 0.; + + float chromaDist = getBoxFilteredChromaDist(texColor.rgb,uv); + + float baseMask = chromaDist - u_similarity; + float fullMask = pow(clamp(baseMask / u_smoothness, 0., 1.), 1.5); + + texColor.rgba *= u_color; + texColor.a = fullMask; + + float spillVal = pow(clamp(baseMask / u_spill, 0., 1.), 1.5); + float desat = clamp(texColor.r * 0.2126 + texColor.g * 0.7152 + texColor.b * 0.0722, 0., 1.); + texColor.rgb = mix(vec3(desat, desat, desat), texColor.rgb, spillVal); + + vec4 finColor = CalcColor(texColor); + + gl_FragColor = finColor; +}`; +const xn = ({ + scene: e, + size: t, + dpr: n, + uniforms: r, + onBeforeCompile: i +}) => { + const v = b(() => new a.PlaneGeometry(2, 2), []), s = b(() => { + const d = new a.ShaderMaterial({ + uniforms: { + u_texture: { value: T }, + u_resolution: { value: new a.Vector2() }, + u_keyColor: { value: J.color }, + u_similarity: { value: J.similarity }, + u_smoothness: { value: J.smoothness }, + u_spill: { value: J.spill }, + u_color: { value: J.color }, + u_contrast: { value: J.contrast }, + u_brightness: { value: J.brightness }, + u_gamma: { value: J.gamma }, + ...r + }, + vertexShader: gn, + fragmentShader: hn, + ...B + }); + return d.onBeforeCompile = V(i), d; + }, [i, r]), u = Y(t, n); + A(s)("u_resolution", u.clone()); + const c = $(e, v, s, a.Mesh); + return { material: s, mesh: c }; +}, J = Object.freeze({ + texture: T, + keyColor: new a.Color(65280), + similarity: 0.2, + smoothness: 0.1, + spill: 0.2, + color: new a.Vector4(1, 1, 1, 1), + contrast: 1, + brightness: 0, + gamma: 1 +}), cr = ({ + size: e, + dpr: t, + samples: n, + isSizeUpdate: r, + uniforms: i, + onBeforeCompile: v +}) => { + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = xn({ + scene: u, + size: e, + dpr: s.shader, + uniforms: i, + onBeforeCompile: v + }), f = j(e), [y, x] = W({ + scene: u, + camera: f, + size: e, + dpr: s.fbo, + samples: n, + isSizeUpdate: r + }), [o, g] = q(J), l = A(c), p = z(c), m = D( + (M, h) => { + g(M), p(h); + }, + [g, p] + ); + return [ + D( + (M, h, S) => { + const { gl: _ } = M; + return m(h, 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), x(_); + }, + [x, l, o, m] + ), + m, + { + scene: u, + mesh: d, + material: c, + camera: f, + renderTarget: y, + output: y.texture + } + ]; +}; +var yn = `precision highp float; + +varying vec2 vUv; +#usf + +#usf + +void main() { + vec4 usf_Position = vec4(position,1.); + vUv = uv; + + #usf
+ + gl_Position = usf_Position; +}`, bn = `precision highp float; + +varying vec2 vUv; +#usf + +uniform sampler2D uTexture; +uniform sampler2D uBackbuffer; +uniform float uTime; +uniform vec2 uPointer; +uniform vec2 uResolution; + +#usf + +void main() { + vec4 usf_FragColor = vec4(1.); + + #usf
+ + gl_FragColor = usf_FragColor; +}`; +const Mn = ({ + scene: e, + size: t, + dpr: n, + uniforms: r, + onBeforeCompile: i +}) => { + const v = b(() => new a.PlaneGeometry(2, 2), []), s = b(() => { + const d = new a.ShaderMaterial({ + uniforms: { + uTexture: { value: T }, + uBackbuffer: { value: T }, + uTime: { value: 0 }, + uPointer: { value: new a.Vector2() }, + uResolution: { value: new a.Vector2() }, + ...r + }, + vertexShader: yn, + fragmentShader: bn, + ...B + }); + return d.onBeforeCompile = V(i), d; + }, [i, r]), u = Y(t, n); + A(s)("uResolution", u.clone()); + const c = $(e, v, s, a.Mesh); + return { material: s, mesh: c }; +}, Sn = Object.freeze({ + texture: T, + beat: !1 +}), vr = ({ + size: e, + dpr: t, + samples: n, + isSizeUpdate: r, + uniforms: i, + onBeforeCompile: v +}) => { + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = Mn({ + scene: u, + size: e, + dpr: s.shader, + uniforms: i, + onBeforeCompile: v + }), f = j(e), y = b( + () => ({ + scene: u, + camera: f, + size: e, + dpr: s.fbo, + samples: n, + isSizeUpdate: r + }), + [u, f, e, s.fbo, n, r] + ), [x, o] = se(y), [g, l] = q(Sn), p = A(c), m = z(c), C = D( + (h, S) => { + l(h), m(S); + }, + [l, m] + ); + return [ + D( + (h, S, _) => { + const { gl: w, clock: I, pointer: R } = h; + return C(S, _), p("uPointer", R), p("uTexture", g.texture), p("uTime", g.beat || I.getElapsedTime()), o(w, ({ read: F }) => { + p("uBackbuffer", F); + }); + }, + [o, p, g, C] + ), + C, + { + scene: u, + mesh: d, + material: c, + camera: f, + renderTarget: x, + output: x.read.texture + } + ]; +}, _n = ({ + scene: e, + geometry: t, + material: n +}) => { + const r = $( + e, + t, + n, + a.Points + ), i = $( + e, + b(() => t.clone(), [t]), + b(() => n.clone(), [n]), + a.Mesh + ); + return i.visible = !1, { + points: r, + interactiveMesh: i + }; +}; +var Cn = `uniform vec2 uResolution; +uniform float uMorphProgress; +uniform float uPointSize; + +uniform sampler2D uPicture; +uniform bool uIsPicture; +uniform sampler2D uAlphaPicture; +uniform bool uIsAlphaPicture; + +uniform vec3 uColor0; +uniform vec3 uColor1; +uniform vec3 uColor2; +uniform vec3 uColor3; + +uniform float uTime; + +uniform float uWobblePositionFrequency; +uniform float uWobbleTimeFrequency; +uniform float uWobbleStrength; +uniform float uWarpPositionFrequency; +uniform float uWarpTimeFrequency; +uniform float uWarpStrength; + +uniform sampler2D uDisplacement; +uniform bool uIsDisplacement; +uniform float uDisplacementIntensity; + +uniform float uSizeRandomIntensity; +uniform float uSizeRandomTimeFrequency; +uniform float uSizeRandomMin; +uniform float uSizeRandomMax; + +uniform float uMapArrayLength; + +uniform float uDivergence; +uniform vec3 uDivergencePoint; + +varying vec3 vColor; +varying float vPictureAlpha; +varying vec3 vDisplacementColor; +varying float vDisplacementIntensity; +varying float vMapArrayIndex; + +#usf + +#usf + +#usf + +float random3D(vec3 co) { + return fract(sin(dot(co.xyz ,vec3(12.9898, 78.233, 45.764))) * 43758.5453); +} + +void main() { + vec3 newPosition = position; + vec2 newUv = uv; + + #usf + #usf + + + vec3 displacement = uIsDisplacement ? texture2D(uDisplacement, newUv).rgb : vec3(0.0); + float displacementIntensity = smoothstep(0., 1., displacement.g); + vDisplacementColor = displacement; + vDisplacementIntensity = displacementIntensity; + + + displacement = displacement * 2.-1.; + displacement *= displacementIntensity * uDisplacementIntensity; + newPosition += displacement; + + + vec3 divergenceDir = newPosition - uDivergencePoint; + if (uDivergence > 0.0) { + newPosition += normalize(divergenceDir) * uDivergence; + } else if (uDivergence < 0.0) { + newPosition -= normalize(divergenceDir) * abs(uDivergence); + } + + + vec4 modelPosition = modelMatrix * vec4(newPosition, 1.0); + vec4 viewPosition = viewMatrix * modelPosition; + vec4 projectedPosition = projectionMatrix * viewPosition; + + + float wobble = uWobbleStrength > 0. ? getWobble(projectedPosition.xyz) : 0.0; + + gl_Position = projectedPosition += wobble; + + + vColor = uIsPicture ? texture2D(uPicture, newUv).rgb : mix(mix(uColor0, uColor1, newPosition.x), mix(uColor2, uColor3, newPosition.y), newPosition.z); + + + vPictureAlpha = uIsAlphaPicture ? texture2D(uAlphaPicture, newUv).g : 1.; + + + + float sizeRand = uSizeRandomIntensity > 0. ? mix(uSizeRandomMin,uSizeRandomMax,(simplexNoise4d(vec4(newPosition,uTime * uSizeRandomTimeFrequency))*.5+.5)) * uSizeRandomIntensity : 1.; + gl_PointSize = uPointSize * vPictureAlpha * uResolution.y * sizeRand; + gl_PointSize *= (1.0 / - viewPosition.z); + + + vMapArrayIndex = uMapArrayLength > 0. ? floor(random3D(position) * uMapArrayLength) : 0.; +}`, wn = `precision highp float; +precision highp int; + +varying vec3 vColor; +varying float vPictureAlpha; +varying vec3 vDisplacementColor; +varying float vDisplacementIntensity; +varying float vMapArrayIndex; + +uniform float uBlurAlpha; +uniform float uBlurRadius; +uniform sampler2D uMap; +uniform bool uIsMap; +uniform sampler2D uAlphaMap; +uniform bool uIsAlphaMap; +uniform float uDisplacementColorIntensity; +uniform float uPointAlpha; + +#usf + +void main() { + vec2 uv = gl_PointCoord; + uv.y = 1.0 - uv.y; + + + float distanceToCenter = length(uv - .5); + float alpha = clamp(uBlurRadius / distanceToCenter - (1.-uBlurAlpha) , 0. , 1.); + + + vec4 mapArrayColor; + #usf + vec4 mapColor = isMapArray ? mapArrayColor : uIsMap ? texture2D(uMap,uv) : vec4(1.); + vec3 finalColor = isMapArray || uIsMap ? mapColor.rgb : vColor; + + + float mixIntensity = clamp(uDisplacementColorIntensity * vDisplacementIntensity,0.,1.); + finalColor = vDisplacementIntensity > 0. ? mix(finalColor,vDisplacementColor,mixIntensity) : finalColor; + + + float alphaMap = uIsAlphaMap ? texture2D(uAlphaMap,uv).g : 1.; + + gl_FragColor = vec4(finalColor,alpha * vPictureAlpha * alphaMap * mapColor.a * uPointAlpha); +}`; +const Pe = (e, t, n, r, i) => { + var f; + const v = n === "position" ? "positionTarget" : "uvTarget", s = n === "position" ? "#usf " : "#usf ", u = n === "position" ? "#usf " : "#usf ", c = n === "position" ? "positionsList" : "uvsList", d = n === "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) { + t.deleteAttribute(n), t.setAttribute( + n, + new a.BufferAttribute(e[0], i) + ); + let y = "", x = ""; + e.forEach((o, g) => { + t.setAttribute( + `${v}${g}`, + new a.BufferAttribute(o, i) + ), y += `attribute vec${i} ${v}${g}; +`, g === 0 ? x += `${v}${g}` : x += `,${v}${g}`; + }), r = r.replace( + `${s}`, + y + ), r = r.replace( + `${u}`, + `vec${i} ${c}[${e.length}] = vec${i}[](${x}); + ${d} + ` + ); + } else + r = r.replace(`${s}`, ""), r = r.replace(`${u}`, ""), (f = t == null ? void 0 : t.attributes[n]) != null && f.array || Ie && console.error( + `use-shader-fx:geometry.attributes.${n}.array is not found` + ); + return r; +}, Re = (e, t, n, r) => { + var v; + let i = []; + if (e && e.length > 0) { + (v = t == null ? void 0 : t.attributes[n]) != null && v.array ? i = [ + t.attributes[n].array, + ...e + ] : i = e; + const s = Math.max(...i.map((u) => u.length)); + i.forEach((u, c) => { + if (u.length < s) { + const d = (s - u.length) / r, f = [], y = Array.from(u); + for (let x = 0; x < d; x++) { + const o = Math.floor(u.length / r * Math.random()) * r; + for (let g = 0; g < r; g++) + f.push(y[o + g]); + } + i[c] = new Float32Array([...y, ...f]); + } + }); + } + return i; +}, Tn = (e, t) => { + let n = ""; + const r = {}; + let i = "mapArrayColor = "; + return e && e.length > 0 ? (e.forEach((s, u) => { + const c = `vMapArrayIndex < ${u}.1`, d = `texture2D(uMapArray${u}, uv)`; + i += `( ${c} ) ? ${d} : `, n += ` + uniform sampler2D uMapArray${u}; + `, r[`uMapArray${u}`] = { value: s }; + }), i += "vec4(1.);", n += "bool isMapArray = true;", r.uMapArrayLength = { value: e.length }) : (i += "vec4(1.0);", n += "bool isMapArray = false;", r.uMapArrayLength = { value: 0 }), { rewritedFragmentShader: t.replace("#usf ", i).replace("#usf ", n), mapArrayUniforms: r }; +}, Dn = ({ + size: e, + dpr: t, + geometry: n, + positions: r, + uvs: i, + mapArray: v, + uniforms: s, + onBeforeCompile: u +}) => { + const c = b( + () => Re(r, n, "position", 3), + [r, n] + ), d = b( + () => Re(i, n, "uv", 2), + [i, n] + ), f = b(() => { + c.length !== d.length && Ie && console.log("use-shader-fx:positions and uvs are not matched"); + const x = Pe( + d, + n, + "uv", + Pe( + c, + n, + "position", + Cn, + 3 + ), + 2 + ), { rewritedFragmentShader: o, mapArrayUniforms: g } = Tn(v, wn), l = new a.ShaderMaterial({ + vertexShader: x, + fragmentShader: o, + blending: a.AdditiveBlending, + ...B, + // Must be transparent + transparent: !0, + 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: T }, + uIsPicture: { value: !1 }, + uAlphaPicture: { value: T }, + uIsAlphaPicture: { value: !1 }, + uColor0: { value: E.color0 }, + uColor1: { value: E.color1 }, + uColor2: { value: E.color2 }, + uColor3: { value: E.color3 }, + uMap: { value: T }, + uIsMap: { value: !1 }, + uAlphaMap: { value: T }, + 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: T }, + 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 }, + ...g, + ...s + } + }); + return l.onBeforeCompile = V(u), l; + }, [ + n, + c, + d, + v, + u, + s + ]), y = Y(e, t); + return A(f)("uResolution", y.clone()), { material: f, modifiedPositions: c, modifiedUvs: d }; +}, Pn = ({ + size: e, + dpr: t, + scene: n = !1, + geometry: r, + positions: i, + uvs: v, + mapArray: s, + uniforms: u, + onBeforeCompile: c +}) => { + const d = U(t), f = b(() => { + const M = r || new a.SphereGeometry(1, 32, 32); + return M.setIndex(null), M.deleteAttribute("normal"), M; + }, [r]), { material: y, modifiedPositions: x, modifiedUvs: o } = Dn({ + size: e, + dpr: d.shader, + geometry: f, + positions: i, + uvs: v, + mapArray: s, + uniforms: u, + onBeforeCompile: c + }), { points: g, interactiveMesh: l } = _n({ + scene: n, + geometry: f, + material: y + }), p = A(y), m = z(y); + return [ + D( + (M, h, S) => { + M && p( + "uTime", + (h == null ? void 0 : h.beat) || M.clock.getElapsedTime() + ), h !== void 0 && (p("uMorphProgress", h.morphProgress), p("uBlurAlpha", h.blurAlpha), p("uBlurRadius", h.blurRadius), p("uPointSize", h.pointSize), p("uPointAlpha", h.pointAlpha), h.picture ? (p("uPicture", h.picture), p("uIsPicture", !0)) : h.picture === !1 && p("uIsPicture", !1), h.alphaPicture ? (p("uAlphaPicture", h.alphaPicture), p("uIsAlphaPicture", !0)) : h.alphaPicture === !1 && p("uIsAlphaPicture", !1), p("uColor0", h.color0), p("uColor1", h.color1), p("uColor2", h.color2), p("uColor3", h.color3), h.map ? (p("uMap", h.map), p("uIsMap", !0)) : h.map === !1 && p("uIsMap", !1), h.alphaMap ? (p("uAlphaMap", h.alphaMap), p("uIsAlphaMap", !0)) : h.alphaMap === !1 && p("uIsAlphaMap", !1), p("uWobbleStrength", h.wobbleStrength), p( + "uWobblePositionFrequency", + h.wobblePositionFrequency + ), p("uWobbleTimeFrequency", h.wobbleTimeFrequency), p("uWarpStrength", h.warpStrength), p("uWarpPositionFrequency", h.warpPositionFrequency), p("uWarpTimeFrequency", h.warpTimeFrequency), h.displacement ? (p("uDisplacement", h.displacement), p("uIsDisplacement", !0)) : h.displacement === !1 && p("uIsDisplacement", !1), p("uDisplacementIntensity", h.displacementIntensity), p( + "uDisplacementColorIntensity", + h.displacementColorIntensity + ), p("uSizeRandomIntensity", h.sizeRandomIntensity), p( + "uSizeRandomTimeFrequency", + h.sizeRandomTimeFrequency + ), p("uSizeRandomMin", h.sizeRandomMin), p("uSizeRandomMax", h.sizeRandomMax), p("uDivergence", h.divergence), p("uDivergencePoint", h.divergencePoint), m(S)); + }, + [p, m] + ), + { + points: g, + interactiveMesh: l, + positions: x, + uvs: o + } + ]; +}, E = Object.freeze({ + morphProgress: 0, + blurAlpha: 0.9, + blurRadius: 0.05, + pointSize: 0.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: 0.5, + wobbleTimeFrequency: 0.5, + warpStrength: 0, + warpPositionFrequency: 0.5, + warpTimeFrequency: 0.5, + displacement: !1, + displacementIntensity: 1, + displacementColorIntensity: 0, + sizeRandomIntensity: 0, + sizeRandomTimeFrequency: 0.2, + sizeRandomMin: 0.5, + sizeRandomMax: 1.5, + divergence: 0, + divergencePoint: new a.Vector3(0), + beat: !1 +}), pr = ({ + size: e, + dpr: t, + samples: n, + isSizeUpdate: r, + camera: i, + geometry: v, + positions: s, + uvs: u, + uniforms: c, + onBeforeCompile: d +}) => { + const f = U(t), y = b(() => new a.Scene(), []), [ + x, + { + points: o, + interactiveMesh: g, + positions: l, + uvs: p + } + ] = Pn({ + scene: y, + size: e, + dpr: t, + geometry: v, + positions: s, + uvs: u, + uniforms: c, + onBeforeCompile: d + }), [m, C] = W({ + scene: y, + camera: i, + size: e, + dpr: f.fbo, + samples: n, + isSizeUpdate: r, + depthBuffer: !0 + }), M = D( + (S, _, w) => (x(S, _, w), C(S.gl)), + [C, x] + ), h = D( + (S, _) => { + x(null, S, _); + }, + [x] + ); + return [ + M, + h, + { + scene: y, + points: o, + interactiveMesh: g, + renderTarget: m, + output: m.texture, + positions: l, + uvs: p + } + ]; +}; +function Rn(e, t = 1e-4) { + t = Math.max(t, Number.EPSILON); + const n = {}, r = e.getIndex(), i = e.getAttribute("position"), v = r ? r.count : i.count; + let s = 0; + const u = Object.keys(e.attributes), c = {}, d = {}, f = [], y = ["getX", "getY", "getZ", "getW"]; + for (let l = 0, p = u.length; l < p; l++) { + const m = u[l]; + c[m] = []; + const C = e.morphAttributes[m]; + C && (d[m] = new Array(C.length).fill(0).map(() => [])); + } + const x = Math.log10(1 / t), o = Math.pow(10, x); + for (let l = 0; l < v; l++) { + const p = r ? r.getX(l) : l; + let m = ""; + for (let C = 0, M = u.length; C < M; C++) { + const h = u[C], S = e.getAttribute(h), _ = S.itemSize; + for (let w = 0; w < _; w++) + m += `${~~(S[y[w]](p) * o)},`; + } + if (m in n) + f.push(n[m]); + else { + for (let C = 0, M = u.length; C < M; C++) { + const h = u[C], S = e.getAttribute(h), _ = e.morphAttributes[h], w = S.itemSize, I = c[h], R = d[h]; + for (let F = 0; F < w; F++) { + const P = y[F]; + if (I.push(S[P](p)), _) + for (let O = 0, k = _.length; O < k; O++) + R[O].push(_[O][P](p)); + } + } + n[m] = s, f.push(s), s++; + } + } + const g = e.clone(); + for (let l = 0, p = u.length; l < p; l++) { + const m = u[l], C = e.getAttribute(m), M = new C.array.constructor(c[m]), h = new De(M, C.itemSize, C.normalized); + if (g.setAttribute(m, h), m in d) + for (let S = 0; S < d[m].length; S++) { + const _ = e.morphAttributes[m][S], w = new _.array.constructor(d[m][S]), I = new De(w, _.itemSize, _.normalized); + g.morphAttributes[m][S] = I; + } + } + return g.setIndex(f), g; +} +var An = `#ifdef USE_TRANSMISSION + + + + + uniform float _transmission; + uniform float thickness; + uniform float attenuationDistance; + uniform vec3 attenuationColor; + + #ifdef USE_TRANSMISSIONMAP + + uniform sampler2D transmissionMap; + + #endif + + #ifdef USE_THICKNESSMAP + + uniform sampler2D thicknessMap; + + #endif + + uniform vec2 transmissionSamplerSize; + uniform sampler2D transmissionSamplerMap; + + uniform mat4 modelMatrix; + uniform mat4 projectionMatrix; + + varying vec3 vWorldPosition; + + + + + float w0( float a ) { + + return ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 ); + + } + + float w1( float a ) { + + return ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 ); + + } + + float w2( float a ){ + + return ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 ); + + } + + float w3( float a ) { + + return ( 1.0 / 6.0 ) * ( a * a * a ); + + } + + + float g0( float a ) { + + return w0( a ) + w1( a ); + + } + + float g1( float a ) { + + return w2( a ) + w3( a ); + + } + + + float h0( float a ) { + + return - 1.0 + w1( a ) / ( w0( a ) + w1( a ) ); + + } + + float h1( float a ) { + + return 1.0 + w3( a ) / ( w2( a ) + w3( a ) ); + + } + + vec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) { + + uv = uv * texelSize.zw + 0.5; + + vec2 iuv = floor( uv ); + vec2 fuv = fract( uv ); + + float g0x = g0( fuv.x ); + float g1x = g1( fuv.x ); + float h0x = h0( fuv.x ); + float h1x = h1( fuv.x ); + float h0y = h0( fuv.y ); + float h1y = h1( fuv.y ); + + vec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy; + vec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy; + vec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy; + vec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy; + + return g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) + + g1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) ); + + } + + vec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) { + + vec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) ); + vec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) ); + vec2 fLodSizeInv = 1.0 / fLodSize; + vec2 cLodSizeInv = 1.0 / cLodSize; + vec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) ); + vec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) ); + return mix( fSample, cSample, fract( lod ) ); + + } + + vec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) { + + + vec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior ); + + + vec3 modelScale; + modelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) ); + modelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) ); + modelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) ); + + + return normalize( refractionVector ) * thickness * modelScale; + + } + + float applyIorToRoughness( const in float roughness, const in float ior ) { + + + + return roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 ); + + } + + vec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) { + + float lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior ); + return textureBicubic( transmissionSamplerMap, fragCoord.xy, lod ); + + } + + vec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) { + + if ( isinf( attenuationDistance ) ) { + + + return vec3( 1.0 ); + + } else { + + + vec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance; + vec3 transmittance = exp( - attenuationCoefficient * transmissionDistance ); + return transmittance; + + } + + } + + vec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor, + const in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix, + const in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness, + const in vec3 attenuationColor, const in float attenuationDistance ) { + + vec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix ); + vec3 refractedRayExit = position + transmissionRay; + + + vec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 ); + vec2 refractionCoords = ndcPos.xy / ndcPos.w; + refractionCoords += 1.0; + refractionCoords /= 2.0; + + + vec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior ); + + vec3 transmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance ); + vec3 attenuatedColor = transmittance * transmittedLight.rgb; + + + vec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness ); + + + + float transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0; + + return vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor ); + + } +#endif`, In = `#ifdef USE_TRANSMISSION + +material.transmission = _transmission; +material.transmissionAlpha = 1.0; +material.thickness = thickness; +material.attenuationDistance = attenuationDistance; +material.attenuationColor = attenuationColor; + +#ifdef USE_TRANSMISSIONMAP + + material.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r; + +#endif + +#ifdef USE_THICKNESSMAP + + material.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g; + +#endif + +vec3 pos = vWorldPosition; + +vec3 v = normalize( cameraPosition - pos ); +vec3 n = inverseTransformDirection( normal, viewMatrix ); + +vec4 transmitted = getIBLVolumeRefraction( + n, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90, + pos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness, + material.attenuationColor, material.attenuationDistance ); + +material.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission ); + +float runningSeed = 0.0; +vec3 transmission = vec3(0.0); +float transmissionR, transmissionB, transmissionG; +float randomCoords = rand(runningSeed++); +float thickness_smear = thickness * max(pow(roughnessFactor, 0.33), uAnisotropicBlur); +vec3 distortionNormal = vec3(0.0); +vec3 temporalOffset = vec3(uTime, -uTime, -uTime) * uTemporalDistortion; + +if (uDistortion > 0.0) { + distortionNormal = uDistortion * vec3(snoiseFractal(vec3((pos * uDistortionScale + temporalOffset))), snoiseFractal(vec3(pos.zxy * uDistortionScale - temporalOffset)), snoiseFractal(vec3(pos.yxz * uDistortionScale + temporalOffset))); +} + +for (float i = 0.0; i < uRefractionSamples; i ++) { + vec3 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); + + transmissionR = getIBLVolumeRefraction( + sampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90, + pos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness + thickness_smear * (i + randomCoords) / uRefractionSamples, + material.attenuationColor, material.attenuationDistance + ).r; + transmissionG = getIBLVolumeRefraction( + sampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90, + pos, modelMatrix, viewMatrix, projectionMatrix, material.ior * (1.0 + uChromaticAberration * (i + randomCoords) / uRefractionSamples) , material.thickness + thickness_smear * (i + randomCoords) / uRefractionSamples, + material.attenuationColor, material.attenuationDistance + ).g; + transmissionB = getIBLVolumeRefraction( + sampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90, + pos, modelMatrix, viewMatrix, projectionMatrix, material.ior * (1.0 + 2.0 * uChromaticAberration * (i + randomCoords) / uRefractionSamples), material.thickness + thickness_smear * (i + randomCoords) / uRefractionSamples, + material.attenuationColor, material.attenuationDistance + ).b; + transmission.r += transmissionR; + transmission.g += transmissionG; + transmission.b += transmissionB; +} + +transmission /= uRefractionSamples; + +totalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission ); + +#endif`; +const Ae = (e) => { + let t = e; + return t = t.replace( + "#include ", + ` + vec3 objectNormal = usf_Normal; + #ifdef USE_TANGENT + vec3 objectTangent = vec3( tangent.xyz ); + #endif` + ), t = t.replace( + "#include ", + ` + vec3 transformed = usf_Position;` + ), t = t.replace( + "void main() {", + ` + uniform float uTime; + uniform float uWobblePositionFrequency; + uniform float uWobbleTimeFrequency; + uniform float uWobbleStrength; + uniform float uWarpPositionFrequency; + uniform float uWarpTimeFrequency; + uniform float uWarpStrength; + attribute vec4 tangent; + varying float vWobble; + varying vec2 vPosition; + // edge + varying vec3 vEdgeNormal; + varying vec3 vEdgeViewPosition; + #usf + void main() { + ` + ), t = t.replace( + "void main() {", + ` + void main() { + vec3 usf_Position = position; + vec3 usf_Normal = normal; + vec3 biTangent = cross(normal, tangent.xyz); + + // Neighbours positions + float shift = 0.01; + vec3 positionA = usf_Position + tangent.xyz * shift; + vec3 positionB = usf_Position + biTangent * shift; + + // wobble + float wobble = (uWobbleStrength > 0.) ? getWobble(usf_Position) : 0.0; + float wobblePositionA = (uWobbleStrength > 0.) ? getWobble(positionA) : 0.0; + float wobblePositionB = (uWobbleStrength > 0.) ? getWobble(positionB) : 0.0; + + usf_Position += wobble * normal; + positionA += wobblePositionA * normal; + positionB += wobblePositionB * normal; + + // Compute normal + vec3 toA = normalize(positionA - usf_Position); + vec3 toB = normalize(positionB - usf_Position); + usf_Normal = cross(toA, toB); + + // Varying + vPosition = usf_Position.xy; + vWobble = wobble/uWobbleStrength; + + vEdgeNormal = normalize(normalMatrix * usf_Normal); + vec4 viewPosition = viewMatrix * modelMatrix * vec4(usf_Position, 1.0); + vEdgeViewPosition = normalize(viewPosition.xyz); + ` + ), t; +}, Fn = ({ + baseMaterial: e, + materialParameters: t, + onBeforeCompile: n, + depthOnBeforeCompile: r, + isCustomTransmission: i = !1, + uniforms: v +}) => { + const { material: s, depthMaterial: u } = b(() => { + const c = new (e || a.MeshPhysicalMaterial)( + t || {} + ); + Object.assign(c.userData, { + uniforms: { + uTime: { value: 0 }, + uWobblePositionFrequency: { + value: N.wobblePositionFrequency + }, + uWobbleTimeFrequency: { + value: N.wobbleTimeFrequency + }, + uWobbleStrength: { value: N.wobbleStrength }, + uWarpPositionFrequency: { + value: N.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 }, + uChromaticAberration: { + value: N.chromaticAberration + }, + uAnisotropicBlur: { value: N.anisotropicBlur }, + uDistortion: { value: N.distortion }, + uDistortionScale: { value: N.distortionScale }, + uTemporalDistortion: { value: N.temporalDistortion }, + uRefractionSamples: { value: N.refractionSamples }, + transmission: { value: 0 }, + _transmission: { value: 1 }, + transmissionMap: { value: null }, + ...v + } + }), c.onBeforeCompile = (f, y) => { + Object.assign(f.uniforms, c.userData.uniforms), f.vertexShader = Ae(f.vertexShader), f.fragmentShader = f.fragmentShader.replace( + "#include ", + ` + #include + + if (uEdgeThreshold > 0.0) { + float edgeThreshold = dot(vEdgeNormal, -vEdgeViewPosition); + diffuseColor = edgeThreshold < uEdgeThreshold ? vec4(uEdgeColor, 1.0) : mix(diffuseColor, usf_DiffuseColor, uColorMix); + } else { + diffuseColor = mix(diffuseColor, usf_DiffuseColor, uColorMix); + } + ` + ), f.fragmentShader = f.fragmentShader.replace( + "void main() {", + ` + uniform vec3 uColor0; + uniform vec3 uColor1; + uniform vec3 uColor2; + uniform vec3 uColor3; + uniform float uColorMix; + uniform float uEdgeThreshold; + uniform vec3 uEdgeColor; + + // transmission + uniform float uChromaticAberration; + uniform float uAnisotropicBlur; + uniform float uTime; + uniform float uDistortion; + uniform float uDistortionScale; + uniform float uTemporalDistortion; + uniform float uRefractionSamples; + + float rand(float n){return fract(sin(n) * 43758.5453123);} + #usf + + varying float vWobble; + varying vec2 vPosition; + varying vec3 vEdgeNormal; + varying vec3 vEdgeViewPosition; + + void main(){ + vec4 usf_DiffuseColor = vec4(1.0); + float colorWobbleMix = smoothstep(-1.,1.,vWobble); + vec2 colorPosMix = vec2(smoothstep(-1.,1.,vPosition.x),smoothstep(-1.,1.,vPosition.y)); + + usf_DiffuseColor.rgb = mix(mix(uColor0, uColor1, colorPosMix.x), mix(uColor2, uColor3, colorPosMix.y), colorWobbleMix); + ` + ), c.type === "MeshPhysicalMaterial" && i && (f.fragmentShader = f.fragmentShader.replace( + "#include ", + `${An}` + ), f.fragmentShader = f.fragmentShader.replace( + "#include ", + `${In}` + )), V(n)(f, y); + }, c.needsUpdate = !0; + const d = new a.MeshDepthMaterial({ + depthPacking: a.RGBADepthPacking + }); + return d.onBeforeCompile = (f, y) => { + Object.assign(f.uniforms, c.userData.uniforms), f.vertexShader = Ae(f.vertexShader), V(r)(f, y); + }, d.needsUpdate = !0, { material: c, depthMaterial: d }; + }, [ + t, + e, + n, + r, + v, + i + ]); + return { + material: s, + depthMaterial: u + }; +}, Vn = ({ + scene: e = !1, + geometry: t, + isCustomTransmission: n, + baseMaterial: r, + materialParameters: i, + onBeforeCompile: v, + depthOnBeforeCompile: s, + uniforms: u +}) => { + const c = b(() => { + let p = t || new a.IcosahedronGeometry(2, 20); + return p = Rn(p), p.computeTangents(), p; + }, [t]), { material: d, depthMaterial: f } = Fn({ + baseMaterial: r, + materialParameters: i, + onBeforeCompile: v, + depthOnBeforeCompile: s, + uniforms: u, + isCustomTransmission: n + }), y = $(e, c, d, a.Mesh), x = d.userData, o = A(x), g = z(x); + return [ + D( + (p, m, C) => { + p && o( + "uTime", + (m == null ? void 0 : m.beat) || p.clock.getElapsedTime() + ), m !== void 0 && (o("uWobbleStrength", m.wobbleStrength), o( + "uWobblePositionFrequency", + m.wobblePositionFrequency + ), o("uWobbleTimeFrequency", m.wobbleTimeFrequency), o("uWarpStrength", m.warpStrength), o("uWarpPositionFrequency", m.warpPositionFrequency), o("uWarpTimeFrequency", m.warpTimeFrequency), o("uColor0", m.color0), o("uColor1", m.color1), o("uColor2", m.color2), o("uColor3", m.color3), o("uColorMix", m.colorMix), o("uEdgeThreshold", m.edgeThreshold), o("uEdgeColor", m.edgeColor), o("uChromaticAberration", m.chromaticAberration), o("uAnisotropicBlur", m.anisotropicBlur), o("uDistortion", m.distortion), o("uDistortionScale", m.distortionScale), o("uRefractionSamples", m.refractionSamples), o("uTemporalDistortion", m.temporalDistortion), g(C)); + }, + [o, g] + ), + { + mesh: y, + depthMaterial: f + } + ]; +}, N = Object.freeze({ + wobbleStrength: 0.3, + wobblePositionFrequency: 0.3, + wobbleTimeFrequency: 0.3, + warpStrength: 0.3, + warpPositionFrequency: 0.3, + warpTimeFrequency: 0.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: 0.1, + anisotropicBlur: 0.1, + distortion: 0, + distortionScale: 0.1, + temporalDistortion: 0, + refractionSamples: 6, + beat: !1 +}), mr = ({ + size: e, + dpr: t, + samples: n, + isSizeUpdate: r, + camera: i, + geometry: v, + baseMaterial: s, + materialParameters: u, + uniforms: c, + onBeforeCompile: d, + depthOnBeforeCompile: f, + isCustomTransmission: y +}) => { + const x = U(t), o = b(() => new a.Scene(), []), [g, { mesh: l, depthMaterial: p }] = Vn({ + baseMaterial: s, + materialParameters: u, + scene: o, + geometry: v, + uniforms: c, + onBeforeCompile: d, + depthOnBeforeCompile: f, + isCustomTransmission: y + }), [m, C] = W({ + scene: o, + camera: i, + size: e, + dpr: x.fbo, + samples: n, + isSizeUpdate: r, + depthBuffer: !0 + }), M = D( + (S, _, w) => (g(S, _, w), C(S.gl)), + [C, g] + ), h = D( + (S, _) => { + g(null, S, _); + }, + [g] + ); + return [ + M, + h, + { + scene: o, + mesh: l, + depthMaterial: p, + renderTarget: m, + output: m.texture + } + ]; +}, fr = (e, t, n) => { + const r = b(() => { + const i = new a.Mesh(t, n); + return e.add(i), i; + }, [t, n, e]); + return ae(() => () => { + e.remove(r), t.dispose(), n.dispose(); + }, [e, t, n, r]), 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 < 0.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 < 0.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 < 0.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 < 0.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 < 0.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 < 0.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 n = 2.5949095; + return e < 0.5 ? Math.pow(2 * e, 2) * ((n + 1) * 2 * e - n) / 2 : (Math.pow(2 * e - 2, 2) * ((n + 1) * (e * 2 - 2) + n) + 2) / 2; + }, + easeInElastic(e) { + const t = 2 * Math.PI / 3; + return e === 0 ? 0 : e === 1 ? 1 : -Math.pow(2, 10 * e - 10) * Math.sin((e * 10 - 10.75) * t); + }, + easeOutElastic(e) { + const t = 2 * Math.PI / 3; + return e === 0 ? 0 : e === 1 ? 1 : Math.pow(2, -10 * e) * Math.sin((e * 10 - 0.75) * t) + 1; + }, + easeInOutElastic(e) { + const t = 2 * Math.PI / 4.5; + return e === 0 ? 0 : e === 1 ? 1 : e < 0.5 ? -(Math.pow(2, 20 * e - 10) * Math.sin((20 * e - 11.125) * t)) / 2 : Math.pow(2, -20 * e + 10) * Math.sin((20 * e - 11.125) * t) / 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 + 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 - ge.easeOutBounce(1 - 2 * e)) / 2 : (1 + ge.easeOutBounce(2 * e - 1)) / 2; + } +}); +function zn(e) { + let t = Math.sin(e * 12.9898) * 43758.5453; + return t - Math.floor(t); +} +const dr = (e, t = "easeOutQuart") => { + const n = e / 60, r = ge[t]; + return D( + (v) => { + let s = v.getElapsedTime() * n; + const u = Math.floor(s), c = r(s - u); + s = c + u; + const d = zn(u); + return { + beat: s, + floor: u, + fract: c, + hash: d + }; + }, + [n, r] + ); +}, gr = (e = 60) => { + const t = b(() => 1 / Math.max(Math.min(e, 60), 1), [e]), n = L(null); + return D( + (i) => { + const v = i.getElapsedTime(); + return n.current === null || v - n.current >= t ? (n.current = v, !0) : !1; + }, + [t] + ); +}, Bn = (e) => { + var r, i; + const t = (r = e.dom) == null ? void 0 : r.length, n = (i = e.texture) == null ? void 0 : i.length; + return !t || !n || t !== n; +}; +var On = `varying vec2 vUv; + +void main() { + vUv = uv; + gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0); +}`, Un = `precision highp float; + +varying vec2 vUv; +uniform sampler2D u_texture; +uniform vec2 u_textureResolution; +uniform vec2 u_resolution; +uniform float u_borderRadius; + +void main() { + + float screenAspect = u_resolution.x / u_resolution.y; + float textureAspect = u_textureResolution.x / u_textureResolution.y; + vec2 ratio = vec2( + min(screenAspect / textureAspect, 1.0), + min(textureAspect / screenAspect, 1.0) + ); + + vec2 adjustedUv = vUv * ratio + (1.0 - ratio) * 0.5; + vec3 textureColor = texture2D(u_texture, adjustedUv).rgb; + float textureAlpha = texture2D(u_texture, adjustedUv).a; + + + float maxSide = max(u_resolution.x, u_resolution.y); + float minSide = min(u_resolution.x, u_resolution.y); + vec2 aspect = u_resolution / maxSide; + vec2 alphaUv = vUv - 0.5; + + float borderRadius = min(u_borderRadius, minSide * 0.5); + vec2 offset = vec2(borderRadius) / u_resolution; + vec2 alphaXY = smoothstep(vec2(0.5 - offset), vec2(0.5 - offset - 0.001), abs(alphaUv)); + float alpha = min(1.0, alphaXY.x + alphaXY.y); + + vec2 alphaUv2 = abs(vUv - 0.5); + float radius = borderRadius / maxSide; + alphaUv2 = (alphaUv2 - 0.5) * aspect + radius; + float roundAlpha = smoothstep(radius + 0.001, radius, length(alphaUv2)); + + alpha = min(1.0, alpha + roundAlpha); + + + alpha *= textureAlpha; + + gl_FragColor = vec4(textureColor, alpha); +}`; +const En = ({ + params: e, + scene: t, + uniforms: n, + onBeforeCompile: r +}) => { + t.children.length > 0 && (t.children.forEach((i) => { + i instanceof a.Mesh && (i.geometry.dispose(), i.material.dispose()); + }), t.remove(...t.children)), e.texture.forEach((i, v) => { + const s = new a.ShaderMaterial({ + uniforms: { + u_texture: { value: i }, + u_textureResolution: { + value: new a.Vector2(0, 0) + }, + u_resolution: { value: new a.Vector2(0, 0) }, + u_borderRadius: { + value: e.boderRadius[v] ? e.boderRadius[v] : 0 + }, + ...n + }, + vertexShader: On, + fragmentShader: Un, + ...B, + // Must be transparent. + transparent: !0 + }); + s.onBeforeCompile = V(r); + const u = new a.Mesh(new a.PlaneGeometry(1, 1), s); + t.add(u); + }); +}, Ln = () => { + const e = L([]), t = L([]); + return D( + ({ + isIntersectingRef: r, + isIntersectingOnceRef: i, + params: v + }) => { + e.current.length > 0 && e.current.forEach((u, c) => { + u.unobserve(t.current[c]); + }), t.current = [], e.current = []; + const s = new Array(v.dom.length).fill(!1); + r.current = [...s], i.current = [...s], v.dom.forEach((u, c) => { + const d = (y) => { + y.forEach((x) => { + v.onIntersect[c] && v.onIntersect[c](x), r.current[c] = x.isIntersecting; + }); + }, f = new IntersectionObserver(d, { + rootMargin: "0px", + threshold: 0 + }); + f.observe(u), e.current.push(f), t.current.push(u); + }); + }, + [] + ); +}, $n = () => { + const e = L([]), t = D( + ({ + params: n, + customParams: r, + size: i, + resolutionRef: v, + scene: s, + isIntersectingRef: u + }) => { + s.children.length !== e.current.length && (e.current = new Array(s.children.length)), s.children.forEach((c, d) => { + var x, o, g, l, p, m; + const f = n.dom[d]; + if (!f) + return; + const y = f.getBoundingClientRect(); + if (e.current[d] = y, c.scale.set(y.width, y.height, 1), c.position.set( + y.left + y.width * 0.5 - i.width * 0.5, + -y.top - y.height * 0.5 + i.height * 0.5, + 0 + ), u.current[d] && (n.rotation[d] && c.rotation.copy(n.rotation[d]), c instanceof a.Mesh)) { + const C = c.material, M = A(C), h = z(C); + M("u_texture", n.texture[d]), M("u_textureResolution", [ + ((g = (o = (x = n.texture[d]) == null ? void 0 : x.source) == null ? void 0 : o.data) == null ? void 0 : g.width) || 0, + ((m = (p = (l = n.texture[d]) == null ? void 0 : l.source) == null ? void 0 : p.data) == null ? void 0 : m.height) || 0 + ]), M( + "u_resolution", + v.current.set(y.width, y.height) + ), M( + "u_borderRadius", + n.boderRadius[d] ? n.boderRadius[d] : 0 + ), h(r); + } + }); + }, + [] + ); + return [e.current, t]; +}, jn = () => { + const e = L([]), t = L([]), n = D((r, i = !1) => { + e.current.forEach((s, u) => { + s && (t.current[u] = !0); + }); + const v = i ? [...t.current] : [...e.current]; + return r < 0 ? v : v[r]; + }, []); + return { + isIntersectingRef: e, + isIntersectingOnceRef: t, + isIntersecting: n + }; +}, qn = (e) => ({ onView: n, onHidden: r }) => { + const i = L(!1); + ae(() => { + let v; + const s = () => { + e.current.some((u) => u) ? i.current || (n && n(), i.current = !0) : i.current && (r && r(), i.current = !1), v = requestAnimationFrame(s); + }; + return v = requestAnimationFrame(s), () => { + cancelAnimationFrame(v); + }; + }, [n, r]); +}, Wn = { + texture: [], + dom: [], + boderRadius: [], + rotation: [], + onIntersect: [] +}, hr = ({ size: e, dpr: t, samples: n, isSizeUpdate: r, uniforms: i, onBeforeCompile: v }, s = []) => { + const u = U(t), c = b(() => new a.Scene(), []), d = j(e), [f, y] = W({ + scene: c, + camera: d, + size: e, + dpr: u.fbo, + samples: n, + isSizeUpdate: r + }), [x, o] = q({ + ...Wn, + updateKey: performance.now() + }), [g, l] = $n(), p = L(new a.Vector2(0, 0)), [m, C] = Ee(!0); + b( + () => C(!0), + // eslint-disable-next-line react-hooks/exhaustive-deps + s + ); + const M = L(null), h = b(() => T, []), S = Ln(), { isIntersectingOnceRef: _, isIntersectingRef: w, isIntersecting: I } = jn(), R = qn(w), F = b(() => (O, k) => { + o(O), l({ + params: x, + customParams: k, + size: e, + resolutionRef: p, + scene: c, + isIntersectingRef: w + }); + }, [w, o, l, e, c, x]); + return [ + D( + (O, k, te) => { + const { gl: H, size: K } = O; + if (F(k, te), Bn(x)) + return h; + if (m) { + if (M.current === x.updateKey) + return h; + M.current = x.updateKey; + } + return m && (En({ + params: x, + size: K, + scene: c, + uniforms: i, + onBeforeCompile: v + }), S({ + isIntersectingRef: w, + isIntersectingOnceRef: _, + params: x + }), C(!1)), y(H); + }, + [ + y, + i, + S, + v, + m, + c, + x, + _, + w, + h, + F + ] + ), + F, + { + scene: c, + camera: d, + renderTarget: f, + output: f.texture, + isIntersecting: I, + DOMRects: g, + intersections: w.current, + useDomView: R + } + ]; +}, xr = ({ + scene: e, + camera: t, + size: n, + dpr: r = !1, + isSizeUpdate: i = !1, + samples: v = 0, + depthBuffer: s = !1, + depthTexture: u = !1 +}, c) => { + const d = L([]), f = Y(n, r); + d.current = b(() => Array.from({ length: c }, () => { + const x = new a.WebGLRenderTarget( + f.x, + f.y, + { + ...he, + samples: v, + depthBuffer: s + } + ); + return u && (x.depthTexture = new a.DepthTexture( + f.x, + f.y, + a.FloatType + )), x; + }), [c]), i && d.current.forEach( + (x) => x.setSize(f.x, f.y) + ), ae(() => { + const x = d.current; + return () => { + x.forEach((o) => o.dispose()); + }; + }, [c]); + const y = D( + (x, o, g) => { + const l = d.current[o]; + return Ce({ + gl: x, + scene: e, + camera: t, + fbo: l, + onBeforeRender: () => g && g({ read: l.texture }) + }), l.texture; + }, + [e, t] + ); + return [d.current, y]; +}; +export { + Zt as ALPHABLENDING_PARAMS, + Sn as BLANK_PARAMS, + ve as BLENDING_PARAMS, + fe as BRIGHTNESSPICKER_PARAMS, + ne as BRUSH_PARAMS, + J as CHROMAKEY_PARAMS, + Z as COLORSTRATA_PARAMS, + ce as COSPALETTE_PARAMS, + an as COVERTEXTURE_PARAMS, + Fe as DELTA_TIME, + Wn as DOMSYNCER_PARAMS, + Me as DUOTONE_PARAMS, + ge as Easing, + he as FBO_OPTION, + ht as FLUID_PARAMS, + Ve as FXBLENDING_PARAMS, + oe as FXTEXTURE_PARAMS, + Se as HSV_PARAMS, + ue as MARBLE_PARAMS, + E as MORPHPARTICLES_PARAMS, + de as MOTIONBLUR_PARAMS, + re as NOISE_PARAMS, + Mt as RIPPLE_PARAMS, + ze as SIMPLEBLUR_PARAMS, + pe as WAVE_PARAMS, + N as WOBBLE3D_PARAMS, + Ce as renderFBO, + z as setCustomUniform, + A as setUniform, + fr as useAddMesh, + or as useAlphaBlending, + dr as useBeat, + vr as useBlank, + er as useBlending, + nr as useBrightnessPicker, + Gn as useBrush, + j as useCamera, + cr as useChromaKey, + Yn as useColorStrata, + xr as useCopyTexture, + Zn as useCosPalette, + ir as useCoverTexture, + Pn as useCreateMorphParticles, + Vn as useCreateWobble3D, + hr as useDomSyncer, + se as useDoubleFBO, + Jn as useDuoTone, + gr as useFPSLimiter, + Kn as useFluid, + rr as useFxBlending, + tr as useFxTexture, + ar as useHSV, + Qn as useMarble, + pr as useMorphParticles, + sr as useMotionBlur, + Hn as useNoise, + q as useParams, + _e as usePointer, + Y as useResolution, + Xn as useRipple, + ur as useSimpleBlur, + W as useSingleFBO, + lr as useWave, + mr 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 new file mode 100644 index 00000000..45ceab68 --- /dev/null +++ b/packages/use-shader-fx/build/use-shader-fx.js.map @@ -0,0 +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/planeVert.glsl","../src/libs/shaders/resolveShaders.ts","../src/utils/setOnBeforeCompile.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","../node_modules/three-stdlib/utils/BufferGeometryUtils.js","../src/fxs/3D/useWobble3D/shaders/transmission_pars_fragment.glsl","../src/fxs/3D/useWobble3D/shaders/transmission_fragment.glsl","../src/fxs/3D/useWobble3D/useMaterial.ts","../src/fxs/3D/useWobble3D/useCreateWobble3D.ts","../src/fxs/3D/useWobble3D/index.ts","../src/utils/useAddMesh.ts","../src/libs/easing.ts","../src/misc/useBeat.ts","../src/misc/useFPSLimiter.ts","../src/misc/useDomSyncer/utils/errorHandler.ts","../src/misc/useDomSyncer/shader/main.vert","../src/misc/useDomSyncer/shader/main.frag","../src/misc/useDomSyncer/utils/createMesh.ts","../src/misc/useDomSyncer/utils/useIntersectionHandler.ts","../src/misc/useDomSyncer/utils/useUpdateDomRect.ts","../src/misc/useDomSyncer/utils/useIsIntersecting.ts","../src/misc/useDomSyncer/utils/createUseDomView.ts","../src/misc/useDomSyncer/index.ts","../src/misc/useCopyTexture.ts"],"sourcesContent":["#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 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}","import * as THREE from \"three\";\n\nimport wobble3D from \"./shaderChunk/wobble3D.glsl\";\nimport snoise from \"./shaderChunk/snoise.glsl\";\nimport coverTexture from \"./shaderChunk/coverTexture.glsl\";\nimport fxBlending from \"./shaderChunk/fxBlending.glsl\";\nimport planeVert from \"./shaderChunk/planeVert.glsl\";\n\nconst SHADER_CHUNK: { [key: string]: string } = {\n wobble3D,\n snoise,\n coverTexture,\n fxBlending,\n planeVert,\n};\n\nconst includePattern = /^[ \\t]*#usf +<([\\w\\d./]+)>/gm;\n\nfunction includeReplacer(match: string, include: string) {\n let string = SHADER_CHUNK[include] || \"\";\n return resolveIncludes(string);\n}\n\nfunction resolveIncludes(string: string) {\n return string.replace(includePattern, includeReplacer);\n}\n\nexport const resolveShaders = (\n parameters: THREE.WebGLProgramParametersWithUniforms\n) => {\n parameters.vertexShader = resolveIncludes(parameters.vertexShader);\n parameters.fragmentShader = resolveIncludes(parameters.fragmentShader);\n};\n","import * as THREE from \"three\";\nimport { resolveShaders } from \"../libs/shaders/resolveShaders\";\n\ntype OnBeforeCompile = (\n parameters: THREE.WebGLProgramParametersWithUniforms,\n renderer: THREE.WebGLRenderer\n) => void;\n\nexport const setOnBeforeCompile = (\n onBeforeCompile?: OnBeforeCompile\n): OnBeforeCompile => {\n return (parameters, renderer) => {\n onBeforeCompile && onBeforeCompile(parameters, renderer);\n resolveShaders(parameters);\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 { 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uBuffer: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent\n transparent: true,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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_OPTION: THREE.RenderTargetOptions = {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n type: THREE.HalfFloatType,\n stencilBuffer: false,\n};\n\nexport type UseFboProps = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n size: Size;\n /** If dpr is set, dpr will be multiplied, default : `false` */\n dpr?: number | false;\n /** Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false` */\n isSizeUpdate?: boolean;\n /** Defines the count of MSAA samples. Can only be used with WebGL 2. default : `0.0` */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, default : `false` */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. default : `false` */\n depthTexture?: boolean;\n};\n\nexport const renderFBO = ({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender,\n onSwap,\n}: {\n gl: THREE.WebGLRenderer;\n fbo: THREE.WebGLRenderTarget;\n scene: THREE.Scene;\n camera: THREE.Camera;\n onBeforeRender: () => void;\n onSwap?: () => void;\n}) => {\n gl.setRenderTarget(fbo);\n onBeforeRender();\n gl.clear();\n gl.render(scene, camera);\n onSwap && onSwap();\n gl.setRenderTarget(null);\n gl.clear();\n};\n\ntype UpdateRenderTarget = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseSingleFBOReturn = [THREE.WebGLRenderTarget, UpdateRenderTarget];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [THREE.WebGLRenderTarget , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useSingleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseSingleFBOReturn => {\n const renderTarget = useRef();\n\n const resolution = useResolution(size, dpr);\n\n renderTarget.current = useMemo(\n () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { FBO_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget | null;\n write: THREE.WebGLRenderTarget | null;\n};\n\ninterface WebGLDoubleRenderTarget extends DoubleRenderTarget {\n swap: () => void;\n}\n\ntype FBOUpdateFunction = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({\n read,\n write,\n }: {\n read: THREE.Texture;\n write: THREE.Texture;\n }) => void\n) => THREE.Texture;\n\ntype UseDoubleFBOReturn = [\n { read: THREE.WebGLRenderTarget; write: THREE.WebGLRenderTarget },\n FBOUpdateFunction\n];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default : `false`\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false`\n * @returns [{read:THREE.WebGLRenderTarget,write:THREE.WebGLRenderTarget} , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useDoubleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseDoubleFBOReturn => {\n const renderTarget = useRef({\n read: null,\n write: null,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n });\n\n const resolution = useResolution(size, dpr);\n\n const initRenderTargets = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n\n if (depthTexture) {\n read.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n write.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n\n return { read, write };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n renderTarget.current.read = initRenderTargets.read;\n renderTarget.current.write = initRenderTargets.write;\n\n if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, []);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current;\n renderFBO({\n gl,\n scene,\n camera,\n fbo: fbo.write!,\n onBeforeRender: () =>\n onBeforeRender &&\n onBeforeRender({\n read: fbo.read!.texture,\n write: fbo.write!.texture,\n }),\n onSwap: () => fbo.swap(),\n });\n return fbo.read?.texture as THREE.Texture;\n },\n [scene, camera]\n );\n\n return [\n { read: renderTarget.current.read, write: renderTarget.current.write },\n updateRenderTarget,\n ];\n};\n","import { Dpr } from \"../fxs/types\";\n\nexport const getDpr = (\n dpr: Dpr\n): { shader: number | false; fbo: number | false } => {\n if (typeof dpr === \"number\") {\n return { shader: dpr, fbo: dpr };\n }\n return {\n shader: dpr.shader ?? false,\n fbo: dpr.fbo ?? false,\n };\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { PointerValues, usePointer } from \"../../../misc/usePointer\";\nimport {\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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const pressureEnd = useRef(null);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class AdvectionMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uSource: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n dt: { value: number };\n dissipation: { value: number };\n };\n}\n\nexport const useAdvectionMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class DivergenceMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useDivergenceMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const divergenceMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class PressureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uDivergence: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const usePressureMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const pressureMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: null },\n uDivergence: { value: null },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class CurlMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useCurlMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const curlMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class VorticityMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uCurl: { value: THREE.Texture };\n curl: { value: number };\n dt: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useVorticityMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const vorticityMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n uCurl: { value: null },\n curl: { value: 0 },\n dt: { value: DELTA_TIME },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class ClearMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n value: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useClearMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n value: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class GradientSubtractMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useGradientSubtractMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const gradientSubtractMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: DEFAULT_TEXTURE },\n uVelocity: { value: DEFAULT_TEXTURE },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\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 = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const splatMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 density_dissipation?: number;\n /** velocity dissipation , default : `0.99` */\n velocity_dissipation?: number;\n /** velocity acceleration , default : `10.0` */\n velocity_acceleration?: number;\n /** pressure dissipation , default : `0.9` */\n pressure_dissipation?: number;\n /** pressure iterations. affects performance , default : `20` */\n pressure_iterations?: number;\n /** curl_strength , default : `35` */\n curl_strength?: number;\n /** splat radius , default : `0.002` */\n splat_radius?: number;\n /** Fluid Color.THREE.Vector3 Alternatively, it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default : `THREE.Vector3(1.0, 1.0, 1.0)` */\n fluid_color?:\n | ((velocity: THREE.Vector2) => THREE.Vector3)\n | THREE.Vector3\n | THREE.Color;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type FluidObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n materials: FluidMaterials;\n camera: THREE.Camera;\n renderTarget: {\n velocity: DoubleRenderTarget;\n density: DoubleRenderTarget;\n curl: THREE.WebGLRenderTarget;\n divergence: THREE.WebGLRenderTarget;\n pressure: DoubleRenderTarget;\n };\n output: THREE.Texture;\n};\n\nexport const FLUID_PARAMS: FluidParams = Object.freeze({\n density_dissipation: 0.98,\n velocity_dissipation: 0.99,\n velocity_acceleration: 10.0,\n pressure_dissipation: 0.9,\n pressure_iterations: 20,\n curl_strength: 35,\n splat_radius: 0.002,\n fluid_color: new THREE.Vector3(1.0, 1.0, 1.0),\n pointerValues: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFluid = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n customFluidProps,\n}: {\n /** you can add `onBeforeComile` of the next material.`initial`,`curl`,`vorticity`,`advection`,`divergence`,`pressure`,`clear`,`gradientSubtract`,`splat` \n\t * ```ts\n\t * fluidOnBeforeCompile: {\n vorticity: {\n onBeforeCompile: (shader) => console.log(shader),\n\t\t\t\tuniforms:{\n\t\t\t\t\thoge: { value: 0.0 },\n\t\t\t\t}\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 }),\n [scene, camera, size, samples, _dpr.fbo, isSizeUpdate]\n );\n const [velocityFBO, updateVelocityFBO] = useDoubleFBO(fboProps);\n const [densityFBO, updateDensityFBO] = useDoubleFBO(fboProps);\n const [curlFBO, updateCurlFBO] = useSingleFBO(fboProps);\n const [divergenceFBO, updateDivergenceFBO] = useSingleFBO(fboProps);\n const [pressureFBO, updatePressureFBO] = useDoubleFBO(fboProps);\n\n const 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.velocity_dissipation!\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.density_dissipation!\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.velocity_acceleration!)\n );\n updateParamsList.splat(\n \"color\",\n spaltVec.current.set(scaledDiff.x, scaledDiff.y, 1.0)\n );\n updateParamsList.splat(\"radius\", params.splat_radius!);\n });\n updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n updateParamsList.splat(\"uTarget\", read);\n const color: THREE.Vector3 | THREE.Color =\n typeof params.fluid_color === \"function\"\n ? params.fluid_color(pointerValues.velocity)\n : params.fluid_color!;\n 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.curl_strength!);\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.pressure_dissipation!);\n });\n\n setMeshMaterial(materials.pressureMaterial);\n updateParamsList.pressure(\"uDivergence\", divergenceTex);\n let pressureTexTemp: THREE.Texture;\n for (let i = 0; i < params.pressure_iterations!; 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","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}","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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\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 uniforms: {\n uOpacity: { value: 0.0 },\n uMap: { value: texture || DEFAULT_TEXTURE },\n ...uniforms,\n },\n blending: THREE.AdditiveBlending,\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent.\n transparent: true,\n });\n return mat;\n }, [texture, uniforms]);\n\n const meshArr = useMemo(() => {\n const temp = [];\n for (let i = 0; i < max; i++) {\n const clonedMat = material.clone();\n\n clonedMat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\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 }, [onBeforeCompile, 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 fadeout_speed?: number;\n /** scale rate, default : `0.3` */\n scale?: number;\n /** alpha, default : `0.6` */\n alpha?: number;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type RippleObject = {\n scene: THREE.Scene;\n meshArr: THREE.Mesh[];\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const RIPPLE_PARAMS: RippleParams = Object.freeze({\n frequency: 0.01,\n rotation: 0.05,\n fadeout_speed: 0.9,\n scale: 0.3,\n alpha: 0.6,\n pointerValues: false,\n});\n\ninterface UseRippleProps extends HooksProps {\n /** texture applied to ripple */\n texture?: THREE.Texture;\n /** ripple size, default:64 */\n scale?: number;\n /** ripple max length, default:100 */\n max?: number;\n}\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useRipple = ({\n texture,\n scale = 64,\n max = 100,\n size,\n dpr,\n samples,\n isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: UseRippleProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const 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.fadeout_speed! * mesh.scale.x + params.scale!;\n mesh.scale.y = mesh.scale.x;\n const opacity = material.uniforms.uOpacity.value;\n setUniform(material)(\n \"uOpacity\",\n opacity * params.fadeout_speed!\n );\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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTime: { value: 0.0 },\n scale: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: 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: { value: COLORSTRATA_PARAMS.laminateInterval },\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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateValue = setUniform(material);\n 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 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(MARBLE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(COSPALETTE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uColor0: { value: DUOTONE_PARAMS.color0 },\n uColor1: { value: DUOTONE_PARAMS.color1 },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { FXTEXTURE_PARAMS } from \".\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture0: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_brightness: { value: BRIGHTNESSPICKER_PARAMS.brightness },\n u_min: { value: BRIGHTNESSPICKER_PARAMS.min },\n u_max: { value: BRIGHTNESSPICKER_PARAMS.max },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n uMapIntensity: { value: FXBLENDING_PARAMS.mapIntensity },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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 uniforms,\n onBeforeCompile,\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 });\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\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\nvoid main() {\n\tvec4 tex = texture2D(u_texture, vUv);\n\tvec3 hsv = rgb2hsv(tex.rgb);\n\thsv.y *= u_saturation;\n\thsv.z *= u_brightness;\n\tvec3 final = hsv2rgb(hsv);\n\tgl_FragColor = vec4(final, tex.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { HSV_PARAMS } from \".\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_brightness: { value: HSV_PARAMS.brightness },\n u_saturation: { value: HSV_PARAMS.saturation },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n uniforms,\n onBeforeCompile,\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 });\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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture: { value: DEFAULT_TEXTURE },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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 uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] =\n useParams(COVERTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uBlurSize: { value: SIMPLEBLUR_PARAMS.blurSize },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n const 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 const iterations = params.blurPower!;\n for (let i = 0; i < iterations; i++) {\n updateValue(\"uTexture\", _tempTexture);\n _tempTexture = updateTempTexture(gl);\n }\n\n return _tempTexture;\n },\n [updateTempTexture, updateValue, 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(MOTIONBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uEpicenter: { value: WAVE_PARAMS.epicenter },\n uProgress: { value: WAVE_PARAMS.progress },\n uStrength: { value: WAVE_PARAMS.strength },\n uWidth: { value: WAVE_PARAMS.width },\n uMode: { value: 0 },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(CHROMAKEY_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene; size: Size; dpr: number | false } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uBackbuffer: { value: DEFAULT_TEXTURE },\n uTime: { value: 0 },\n uPointer: { value: new THREE.Vector2() },\n uResolution: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) as BlankMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { BlankMaterial, 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(BLANK_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n size: Size;\n dpr: number | false;\n geometry: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\n mapArray?: THREE.Texture[];\n} & MaterialProps) => {\n const modifiedPositions = useMemo(\n () => modifyAttributes(positions, geometry, \"position\", 3),\n [positions, geometry]\n );\n\n const modifiedUvs = useMemo(\n () => modifyAttributes(uvs, geometry, \"uv\", 2),\n [uvs, geometry]\n );\n\n const material = useMemo(() => {\n if (modifiedPositions.length !== modifiedUvs.length) {\n ISDEV &&\n console.log(\"use-shader-fx:positions and uvs are not matched\");\n }\n\n // vertex\n const rewritedVertexShader = rewriteVertexShader(\n modifiedUvs,\n geometry,\n \"uv\",\n rewriteVertexShader(\n modifiedPositions,\n geometry,\n \"position\",\n vertexShader,\n 3\n ),\n 2\n );\n\n // fragment\n const { rewritedFragmentShader, mapArrayUniforms } =\n rewriteFragmentShader(mapArray, fragmentShader);\n\n const mat = new THREE.ShaderMaterial({\n vertexShader: rewritedVertexShader,\n fragmentShader: rewritedFragmentShader,\n blending: THREE.AdditiveBlending,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent\n transparent: true,\n uniforms: {\n uResolution: { value: new THREE.Vector2(0, 0) },\n uMorphProgress: { value: MORPHPARTICLES_PARAMS.morphProgress },\n uBlurAlpha: { value: MORPHPARTICLES_PARAMS.blurAlpha },\n uBlurRadius: { value: MORPHPARTICLES_PARAMS.blurRadius },\n uPointSize: { value: MORPHPARTICLES_PARAMS.pointSize },\n uPointAlpha: { value: MORPHPARTICLES_PARAMS.pointAlpha },\n uPicture: { value: 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: { value: MORPHPARTICLES_PARAMS.wobbleStrength },\n uWarpPositionFrequency: {\n value: MORPHPARTICLES_PARAMS.warpPositionFrequency,\n },\n uWarpTimeFrequency: {\n value: MORPHPARTICLES_PARAMS.warpTimeFrequency,\n },\n uWarpStrength: { value: MORPHPARTICLES_PARAMS.warpStrength },\n uDisplacement: { value: 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: { value: MORPHPARTICLES_PARAMS.sizeRandomMin },\n uSizeRandomMax: { value: MORPHPARTICLES_PARAMS.sizeRandomMax },\n uDivergence: { value: MORPHPARTICLES_PARAMS.divergence },\n uDivergencePoint: { value: MORPHPARTICLES_PARAMS.divergencePoint },\n ...mapArrayUniforms,\n ...uniforms,\n },\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [\n geometry,\n modifiedPositions,\n modifiedUvs,\n mapArray,\n onBeforeCompile,\n uniforms,\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 uniforms,\n onBeforeCompile,\n}: Create3DHooksProps &\n UseCreateMorphParticlesProps): UseCreateMorphParticlesReturn => {\n const _dpr = getDpr(dpr);\n\n const morphGeometry = useMemo(() => {\n const geo = geometry || new THREE.SphereGeometry(1, 32, 32);\n geo.setIndex(null);\n // Since it is a particle, normal is not necessary\n geo.deleteAttribute(\"normal\");\n return geo;\n }, [geometry]);\n\n const { material, modifiedPositions, modifiedUvs } = useMaterial({\n size,\n dpr: _dpr.shader,\n geometry: morphGeometry,\n positions,\n uvs,\n mapArray,\n uniforms,\n onBeforeCompile,\n });\n\n const { points, interactiveMesh } = useCreateObject({\n scene,\n geometry: morphGeometry,\n material,\n });\n\n const updateValue = setUniform(material);\n const 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 camera,\n geometry,\n positions,\n uvs,\n uniforms,\n onBeforeCompile,\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 uniforms,\n onBeforeCompile,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n });\n\n const updateFx = useCallback(\n (\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 { BufferGeometry, BufferAttribute, InterleavedBuffer, InterleavedBufferAttribute, TrianglesDrawMode, TriangleFanDrawMode, TriangleStripDrawMode, Vector3, Float32BufferAttribute } from \"three\";\nimport { getWithKey } from \"../types/helpers.js\";\nconst mergeBufferGeometries = (geometries, useGroups) => {\n const isIndexed = geometries[0].index !== null;\n const attributesUsed = new Set(Object.keys(geometries[0].attributes));\n const morphAttributesUsed = new Set(Object.keys(geometries[0].morphAttributes));\n const attributes = {};\n const morphAttributes = {};\n const morphTargetsRelative = geometries[0].morphTargetsRelative;\n const mergedGeometry = new BufferGeometry();\n let offset = 0;\n geometries.forEach((geom, i) => {\n let attributesCount = 0;\n if (isIndexed !== (geom.index !== null)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.\"\n );\n return null;\n }\n for (let name in geom.attributes) {\n if (!attributesUsed.has(name)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.'\n );\n return null;\n }\n if (attributes[name] === void 0) {\n attributes[name] = [];\n }\n attributes[name].push(geom.attributes[name]);\n attributesCount++;\n }\n if (attributesCount !== attributesUsed.size) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". Make sure all geometries have the same number of attributes.\"\n );\n return null;\n }\n if (morphTargetsRelative !== geom.morphTargetsRelative) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". .morphTargetsRelative must be consistent throughout all geometries.\"\n );\n return null;\n }\n for (let name in geom.morphAttributes) {\n if (!morphAttributesUsed.has(name)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". .morphAttributes must be consistent throughout all geometries.\"\n );\n return null;\n }\n if (morphAttributes[name] === void 0)\n morphAttributes[name] = [];\n morphAttributes[name].push(geom.morphAttributes[name]);\n }\n mergedGeometry.userData.mergedUserData = mergedGeometry.userData.mergedUserData || [];\n mergedGeometry.userData.mergedUserData.push(geom.userData);\n if (useGroups) {\n let count;\n if (geom.index) {\n count = geom.index.count;\n } else if (geom.attributes.position !== void 0) {\n count = geom.attributes.position.count;\n } else {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". The geometry must have either an index or a position attribute\"\n );\n return null;\n }\n mergedGeometry.addGroup(offset, count, i);\n offset += count;\n }\n });\n if (isIndexed) {\n let indexOffset = 0;\n const mergedIndex = [];\n geometries.forEach((geom) => {\n const index = geom.index;\n for (let j = 0; j < index.count; ++j) {\n mergedIndex.push(index.getX(j) + indexOffset);\n }\n indexOffset += geom.attributes.position.count;\n });\n mergedGeometry.setIndex(mergedIndex);\n }\n for (let name in attributes) {\n const mergedAttribute = mergeBufferAttributes(attributes[name]);\n if (!mergedAttribute) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the \" + name + \" attribute.\"\n );\n return null;\n }\n mergedGeometry.setAttribute(name, mergedAttribute);\n }\n for (let name in morphAttributes) {\n const numMorphTargets = morphAttributes[name][0].length;\n if (numMorphTargets === 0)\n break;\n mergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n mergedGeometry.morphAttributes[name] = [];\n for (let i = 0; i < numMorphTargets; ++i) {\n const morphAttributesToMerge = [];\n for (let j = 0; j < morphAttributes[name].length; ++j) {\n morphAttributesToMerge.push(morphAttributes[name][j][i]);\n }\n const mergedMorphAttribute = mergeBufferAttributes(morphAttributesToMerge);\n if (!mergedMorphAttribute) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the \" + name + \" morphAttribute.\"\n );\n return null;\n }\n mergedGeometry.morphAttributes[name].push(mergedMorphAttribute);\n }\n }\n return mergedGeometry;\n};\nconst mergeBufferAttributes = (attributes) => {\n let TypedArray = void 0;\n let itemSize = void 0;\n let normalized = void 0;\n let arrayLength = 0;\n attributes.forEach((attr) => {\n if (TypedArray === void 0) {\n TypedArray = attr.array.constructor;\n }\n if (TypedArray !== attr.array.constructor) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.\"\n );\n return null;\n }\n if (itemSize === void 0)\n itemSize = attr.itemSize;\n if (itemSize !== attr.itemSize) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.\"\n );\n return null;\n }\n if (normalized === void 0)\n normalized = attr.normalized;\n if (normalized !== attr.normalized) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.\"\n );\n return null;\n }\n arrayLength += attr.array.length;\n });\n if (TypedArray && itemSize) {\n const array = new TypedArray(arrayLength);\n let offset = 0;\n attributes.forEach((attr) => {\n array.set(attr.array, offset);\n offset += attr.array.length;\n });\n return new BufferAttribute(array, itemSize, normalized);\n }\n};\nconst interleaveAttributes = (attributes) => {\n let TypedArray = void 0;\n let arrayLength = 0;\n let stride = 0;\n for (let i = 0, l = attributes.length; i < l; ++i) {\n const attribute = attributes[i];\n if (TypedArray === void 0)\n TypedArray = attribute.array.constructor;\n if (TypedArray !== attribute.array.constructor) {\n console.error(\"AttributeBuffers of different types cannot be interleaved\");\n return null;\n }\n arrayLength += attribute.array.length;\n stride += attribute.itemSize;\n }\n const interleavedBuffer = new InterleavedBuffer(new TypedArray(arrayLength), stride);\n let offset = 0;\n const res = [];\n const getters = [\"getX\", \"getY\", \"getZ\", \"getW\"];\n const setters = [\"setX\", \"setY\", \"setZ\", \"setW\"];\n for (let j = 0, l = attributes.length; j < l; j++) {\n const attribute = attributes[j];\n const itemSize = attribute.itemSize;\n const count = attribute.count;\n const iba = new InterleavedBufferAttribute(interleavedBuffer, itemSize, offset, attribute.normalized);\n res.push(iba);\n offset += itemSize;\n for (let c = 0; c < count; c++) {\n for (let k = 0; k < itemSize; k++) {\n const set = getWithKey(iba, setters[k]);\n const get = getWithKey(attribute, getters[k]);\n set(c, get(c));\n }\n }\n }\n return res;\n};\nfunction estimateBytesUsed(geometry) {\n let mem = 0;\n for (let name in geometry.attributes) {\n const attr = geometry.getAttribute(name);\n mem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n }\n const indices = geometry.getIndex();\n mem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n return mem;\n}\nfunction mergeVertices(geometry, tolerance = 1e-4) {\n tolerance = Math.max(tolerance, Number.EPSILON);\n const hashToIndex = {};\n const indices = geometry.getIndex();\n const positions = geometry.getAttribute(\"position\");\n const vertexCount = indices ? indices.count : positions.count;\n let nextIndex = 0;\n const attributeNames = Object.keys(geometry.attributes);\n const attrArrays = {};\n const morphAttrsArrays = {};\n const newIndices = [];\n const getters = [\"getX\", \"getY\", \"getZ\", \"getW\"];\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n const name = attributeNames[i];\n attrArrays[name] = [];\n const morphAttr = geometry.morphAttributes[name];\n if (morphAttr) {\n morphAttrsArrays[name] = new Array(morphAttr.length).fill(0).map(() => []);\n }\n }\n const decimalShift = Math.log10(1 / tolerance);\n const shiftMultiplier = Math.pow(10, decimalShift);\n for (let i = 0; i < vertexCount; i++) {\n const index = indices ? indices.getX(i) : i;\n let hash = \"\";\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const itemSize = attribute.itemSize;\n for (let k = 0; k < itemSize; k++) {\n hash += `${~~(attribute[getters[k]](index) * shiftMultiplier)},`;\n }\n }\n if (hash in hashToIndex) {\n newIndices.push(hashToIndex[hash]);\n } else {\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const morphAttr = geometry.morphAttributes[name];\n const itemSize = attribute.itemSize;\n const newarray = attrArrays[name];\n const newMorphArrays = morphAttrsArrays[name];\n for (let k = 0; k < itemSize; k++) {\n const getterFunc = getters[k];\n newarray.push(attribute[getterFunc](index));\n if (morphAttr) {\n for (let m = 0, ml = morphAttr.length; m < ml; m++) {\n newMorphArrays[m].push(morphAttr[m][getterFunc](index));\n }\n }\n }\n }\n hashToIndex[hash] = nextIndex;\n newIndices.push(nextIndex);\n nextIndex++;\n }\n }\n const result = geometry.clone();\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n const name = attributeNames[i];\n const oldAttribute = geometry.getAttribute(name);\n const buffer = new oldAttribute.array.constructor(attrArrays[name]);\n const attribute = new BufferAttribute(buffer, oldAttribute.itemSize, oldAttribute.normalized);\n result.setAttribute(name, attribute);\n if (name in morphAttrsArrays) {\n for (let j = 0; j < morphAttrsArrays[name].length; j++) {\n const oldMorphAttribute = geometry.morphAttributes[name][j];\n const buffer2 = new oldMorphAttribute.array.constructor(morphAttrsArrays[name][j]);\n const morphAttribute = new BufferAttribute(buffer2, oldMorphAttribute.itemSize, oldMorphAttribute.normalized);\n result.morphAttributes[name][j] = morphAttribute;\n }\n }\n }\n result.setIndex(newIndices);\n return result;\n}\nfunction toTrianglesDrawMode(geometry, drawMode) {\n if (drawMode === TrianglesDrawMode) {\n console.warn(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.\");\n return geometry;\n }\n if (drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode) {\n let index = geometry.getIndex();\n if (index === null) {\n const indices = [];\n const position = geometry.getAttribute(\"position\");\n if (position !== void 0) {\n for (let i = 0; i < position.count; i++) {\n indices.push(i);\n }\n geometry.setIndex(indices);\n index = geometry.getIndex();\n } else {\n console.error(\n \"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.\"\n );\n return geometry;\n }\n }\n const numberOfTriangles = index.count - 2;\n const newIndices = [];\n if (index) {\n if (drawMode === TriangleFanDrawMode) {\n for (let i = 1; i <= numberOfTriangles; i++) {\n newIndices.push(index.getX(0));\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n }\n } else {\n for (let i = 0; i < numberOfTriangles; i++) {\n if (i % 2 === 0) {\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i + 2));\n } else {\n newIndices.push(index.getX(i + 2));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i));\n }\n }\n }\n }\n if (newIndices.length / 3 !== numberOfTriangles) {\n console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.\");\n }\n const newGeometry = geometry.clone();\n newGeometry.setIndex(newIndices);\n newGeometry.clearGroups();\n return newGeometry;\n } else {\n console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:\", drawMode);\n return geometry;\n }\n}\nfunction computeMorphedAttributes(object) {\n if (object.geometry.isBufferGeometry !== true) {\n console.error(\"THREE.BufferGeometryUtils: Geometry is not of type BufferGeometry.\");\n return null;\n }\n const _vA = new Vector3();\n const _vB = new Vector3();\n const _vC = new Vector3();\n const _tempA = new Vector3();\n const _tempB = new Vector3();\n const _tempC = new Vector3();\n const _morphA = new Vector3();\n const _morphB = new Vector3();\n const _morphC = new Vector3();\n function _calculateMorphedAttributeData(object2, material2, attribute, morphAttribute, morphTargetsRelative2, a2, b2, c2, modifiedAttributeArray) {\n _vA.fromBufferAttribute(attribute, a2);\n _vB.fromBufferAttribute(attribute, b2);\n _vC.fromBufferAttribute(attribute, c2);\n const morphInfluences = object2.morphTargetInfluences;\n if (\n // @ts-ignore\n material2.morphTargets && morphAttribute && morphInfluences\n ) {\n _morphA.set(0, 0, 0);\n _morphB.set(0, 0, 0);\n _morphC.set(0, 0, 0);\n for (let i2 = 0, il2 = morphAttribute.length; i2 < il2; i2++) {\n const influence = morphInfluences[i2];\n const morph = morphAttribute[i2];\n if (influence === 0)\n continue;\n _tempA.fromBufferAttribute(morph, a2);\n _tempB.fromBufferAttribute(morph, b2);\n _tempC.fromBufferAttribute(morph, c2);\n if (morphTargetsRelative2) {\n _morphA.addScaledVector(_tempA, influence);\n _morphB.addScaledVector(_tempB, influence);\n _morphC.addScaledVector(_tempC, influence);\n } else {\n _morphA.addScaledVector(_tempA.sub(_vA), influence);\n _morphB.addScaledVector(_tempB.sub(_vB), influence);\n _morphC.addScaledVector(_tempC.sub(_vC), influence);\n }\n }\n _vA.add(_morphA);\n _vB.add(_morphB);\n _vC.add(_morphC);\n }\n if (object2.isSkinnedMesh) {\n object2.boneTransform(a2, _vA);\n object2.boneTransform(b2, _vB);\n object2.boneTransform(c2, _vC);\n }\n modifiedAttributeArray[a2 * 3 + 0] = _vA.x;\n modifiedAttributeArray[a2 * 3 + 1] = _vA.y;\n modifiedAttributeArray[a2 * 3 + 2] = _vA.z;\n modifiedAttributeArray[b2 * 3 + 0] = _vB.x;\n modifiedAttributeArray[b2 * 3 + 1] = _vB.y;\n modifiedAttributeArray[b2 * 3 + 2] = _vB.z;\n modifiedAttributeArray[c2 * 3 + 0] = _vC.x;\n modifiedAttributeArray[c2 * 3 + 1] = _vC.y;\n modifiedAttributeArray[c2 * 3 + 2] = _vC.z;\n }\n const geometry = object.geometry;\n const material = object.material;\n let a, b, c;\n const index = geometry.index;\n const positionAttribute = geometry.attributes.position;\n const morphPosition = geometry.morphAttributes.position;\n const morphTargetsRelative = geometry.morphTargetsRelative;\n const normalAttribute = geometry.attributes.normal;\n const morphNormal = geometry.morphAttributes.position;\n const groups = geometry.groups;\n const drawRange = geometry.drawRange;\n let i, j, il, jl;\n let group, groupMaterial;\n let start, end;\n const modifiedPosition = new Float32Array(positionAttribute.count * positionAttribute.itemSize);\n const modifiedNormal = new Float32Array(normalAttribute.count * normalAttribute.itemSize);\n if (index !== null) {\n if (Array.isArray(material)) {\n for (i = 0, il = groups.length; i < il; i++) {\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n start = Math.max(group.start, drawRange.start);\n end = Math.min(group.start + group.count, drawRange.start + drawRange.count);\n for (j = start, jl = end; j < jl; j += 3) {\n a = index.getX(j);\n b = index.getX(j + 1);\n c = index.getX(j + 2);\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else {\n start = Math.max(0, drawRange.start);\n end = Math.min(index.count, drawRange.start + drawRange.count);\n for (i = start, il = end; i < il; i += 3) {\n a = index.getX(i);\n b = index.getX(i + 1);\n c = index.getX(i + 2);\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else if (positionAttribute !== void 0) {\n if (Array.isArray(material)) {\n for (i = 0, il = groups.length; i < il; i++) {\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n start = Math.max(group.start, drawRange.start);\n end = Math.min(group.start + group.count, drawRange.start + drawRange.count);\n for (j = start, jl = end; j < jl; j += 3) {\n a = j;\n b = j + 1;\n c = j + 2;\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else {\n start = Math.max(0, drawRange.start);\n end = Math.min(positionAttribute.count, drawRange.start + drawRange.count);\n for (i = start, il = end; i < il; i += 3) {\n a = i;\n b = i + 1;\n c = i + 2;\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n }\n const morphedPositionAttribute = new Float32BufferAttribute(modifiedPosition, 3);\n const morphedNormalAttribute = new Float32BufferAttribute(modifiedNormal, 3);\n return {\n positionAttribute,\n normalAttribute,\n morphedPositionAttribute,\n morphedNormalAttribute\n };\n}\nfunction toCreasedNormals(geometry, creaseAngle = Math.PI / 3) {\n const creaseDot = Math.cos(creaseAngle);\n const hashMultiplier = (1 + 1e-10) * 100;\n const verts = [new Vector3(), new Vector3(), new Vector3()];\n const tempVec1 = new Vector3();\n const tempVec2 = new Vector3();\n const tempNorm = new Vector3();\n const tempNorm2 = new Vector3();\n function hashVertex(v) {\n const x = ~~(v.x * hashMultiplier);\n const y = ~~(v.y * hashMultiplier);\n const z = ~~(v.z * hashMultiplier);\n return `${x},${y},${z}`;\n }\n const resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;\n const posAttr = resultGeometry.attributes.position;\n const vertexMap = {};\n for (let i = 0, l = posAttr.count / 3; i < l; i++) {\n const i3 = 3 * i;\n const a = verts[0].fromBufferAttribute(posAttr, i3 + 0);\n const b = verts[1].fromBufferAttribute(posAttr, i3 + 1);\n const c = verts[2].fromBufferAttribute(posAttr, i3 + 2);\n tempVec1.subVectors(c, b);\n tempVec2.subVectors(a, b);\n const normal = new Vector3().crossVectors(tempVec1, tempVec2).normalize();\n for (let n = 0; n < 3; n++) {\n const vert = verts[n];\n const hash = hashVertex(vert);\n if (!(hash in vertexMap)) {\n vertexMap[hash] = [];\n }\n vertexMap[hash].push(normal);\n }\n }\n const normalArray = new Float32Array(posAttr.count * 3);\n const normAttr = new BufferAttribute(normalArray, 3, false);\n for (let i = 0, l = posAttr.count / 3; i < l; i++) {\n const i3 = 3 * i;\n const a = verts[0].fromBufferAttribute(posAttr, i3 + 0);\n const b = verts[1].fromBufferAttribute(posAttr, i3 + 1);\n const c = verts[2].fromBufferAttribute(posAttr, i3 + 2);\n tempVec1.subVectors(c, b);\n tempVec2.subVectors(a, b);\n tempNorm.crossVectors(tempVec1, tempVec2).normalize();\n for (let n = 0; n < 3; n++) {\n const vert = verts[n];\n const hash = hashVertex(vert);\n const otherNormals = vertexMap[hash];\n tempNorm2.set(0, 0, 0);\n for (let k = 0, lk = otherNormals.length; k < lk; k++) {\n const otherNorm = otherNormals[k];\n if (tempNorm.dot(otherNorm) > creaseDot) {\n tempNorm2.add(otherNorm);\n }\n }\n tempNorm2.normalize();\n normAttr.setXYZ(i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z);\n }\n }\n resultGeometry.setAttribute(\"normal\", normAttr);\n return resultGeometry;\n}\nexport {\n computeMorphedAttributes,\n estimateBytesUsed,\n interleaveAttributes,\n mergeBufferAttributes,\n mergeBufferGeometries,\n mergeVertices,\n toCreasedNormals,\n toTrianglesDrawMode\n};\n//# sourceMappingURL=BufferGeometryUtils.js.map\n","#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 { useMemo } from \"react\";\nimport transmission_pars_fragment from \"./shaders/transmission_pars_fragment.glsl\";\nimport transmission_fragment from \"./shaders/transmission_fragment.glsl\";\nimport { WOBBLE3D_PARAMS } from \".\";\nimport { MaterialProps } from \"../../types\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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\n/** You also need to rewrite the vertext shader of depthMaterial */\nconst rewriteVertex = (vertex: string) => {\n let shader = vertex;\n shader = shader.replace(\n \"#include \",\n `\n\t\tvec3 objectNormal = usf_Normal;\n\t\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t\t#endif`\n );\n // position\n shader = shader.replace(\n \"#include \",\n `\n\t\tvec3 transformed = usf_Position;`\n );\n\n // uniforms\n shader = shader.replace(\n \"void main() {\",\n `\n\t\tuniform float uTime;\n\t\tuniform float uWobblePositionFrequency;\n\t\tuniform float uWobbleTimeFrequency;\n\t\tuniform float uWobbleStrength;\n\t\tuniform float uWarpPositionFrequency;\n\t\tuniform float uWarpTimeFrequency;\n\t\tuniform float uWarpStrength;\n\t\tattribute vec4 tangent;\n\t\tvarying float vWobble;\n\t\tvarying vec2 vPosition;\n\t\t// edge\n\t\tvarying vec3 vEdgeNormal;\n\t\tvarying vec3 vEdgeViewPosition;\n\t\t#usf \n\t\tvoid main() {\n\t\t`\n );\n\n // vert\n shader = shader.replace(\n \"void main() {\",\n `\n\t\tvoid main() {\n\t\tvec3 usf_Position = position;\n\t\tvec3 usf_Normal = normal;\n\t\tvec3 biTangent = cross(normal, tangent.xyz);\n\t\t\n\t\t// Neighbours positions\n\t\tfloat shift = 0.01;\n\t\tvec3 positionA = usf_Position + tangent.xyz * shift;\n\t\tvec3 positionB = usf_Position + biTangent * shift;\n\t\t\n\t\t// wobble\n\t\tfloat wobble = (uWobbleStrength > 0.) ? getWobble(usf_Position) : 0.0;\n\t\tfloat wobblePositionA = (uWobbleStrength > 0.) ? getWobble(positionA) : 0.0;\n\t\tfloat wobblePositionB = (uWobbleStrength > 0.) ? getWobble(positionB) : 0.0;\n\t\t\n\t\tusf_Position += wobble * normal;\n\t\tpositionA += wobblePositionA * normal;\n\t\tpositionB += wobblePositionB * normal;\n\n\t\t// Compute normal\n\t\tvec3 toA = normalize(positionA - usf_Position);\n\t\tvec3 toB = normalize(positionB - usf_Position);\n\t\tusf_Normal = cross(toA, toB);\n\t\t\n\t\t// Varying\n\t\tvPosition = usf_Position.xy;\n\t\tvWobble = wobble/uWobbleStrength;\n\t\t\n\t\tvEdgeNormal = normalize(normalMatrix * usf_Normal);\n\t\tvec4 viewPosition = viewMatrix * modelMatrix * vec4(usf_Position, 1.0);\n\t\tvEdgeViewPosition = normalize(viewPosition.xyz);\n\t\t`\n );\n return shader;\n};\n\nexport type WobbleMaterialConstructor = new (opts: {\n [key: string]: any;\n}) => THREE.Material;\ntype WobbleMaterialParams =\n ConstructorParameters[0];\nexport interface WobbleMaterialProps\n extends MaterialProps {\n /** default:THREE.MeshPhysicalMaterial */\n baseMaterial?: T;\n materialParameters?: WobbleMaterialParams;\n /**\n * An optional callback that is executed immediately before the depth shader program is compiled.\n * @param shader — Source code of the shader\n * @param renderer — WebGLRenderer Context that is initializing the material\n */\n depthOnBeforeCompile?: (\n shader: THREE.WebGLProgramParametersWithUniforms,\n renderer: THREE.WebGLRenderer\n ) => 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 onBeforeCompile,\n depthOnBeforeCompile,\n isCustomTransmission = false,\n uniforms,\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 ...uniforms,\n },\n });\n\n mat.onBeforeCompile = (shader, renderer) => {\n Object.assign(shader.uniforms, mat.userData.uniforms);\n\n /********************\n\t\t\tvert\n\t\t\t********************/\n shader.vertexShader = rewriteVertex(shader.vertexShader);\n\n /********************\n\t\t\tfrag\n\t\t\t********************/\n // diffuse color , Manipulate color mixing ratio with `uColorMix`\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `\n\t\t\t\t\t#include \n\n\t\t\t\t\tif (uEdgeThreshold > 0.0) {\n\t\t\t\t\t\tfloat edgeThreshold = dot(vEdgeNormal, -vEdgeViewPosition);\n\t\t\t\t\t\tdiffuseColor = edgeThreshold < uEdgeThreshold ? vec4(uEdgeColor, 1.0) : mix(diffuseColor, usf_DiffuseColor, uColorMix);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdiffuseColor = mix(diffuseColor, usf_DiffuseColor, uColorMix);\n\t\t\t\t\t}\n\t\t\t\t`\n );\n\n // frag\n shader.fragmentShader = shader.fragmentShader.replace(\n \"void main() {\",\n `\n\t\t\t\tuniform vec3 uColor0;\n\t\t\t\tuniform vec3 uColor1;\n\t\t\t\tuniform vec3 uColor2;\n\t\t\t\tuniform vec3 uColor3;\n\t\t\t\tuniform float uColorMix;\n\t\t\t\tuniform float uEdgeThreshold;\n\t\t\t\tuniform vec3 uEdgeColor;\n\t\t\t\t\n\t\t\t\t// transmission\n\t\t\t\tuniform float uChromaticAberration; \n\t\t\t\tuniform float uAnisotropicBlur; \n\t\t\t\tuniform float uTime;\n\t\t\t\tuniform float uDistortion;\n\t\t\t\tuniform float uDistortionScale;\n\t\t\t\tuniform float uTemporalDistortion;\n\t\t\t\tuniform float uRefractionSamples;\n\t\t\t\t\n\t\t\t\tfloat rand(float n){return fract(sin(n) * 43758.5453123);}\n\t\t\t\t#usf \n\n\t\t\t\tvarying float vWobble;\n\t\t\t\tvarying vec2 vPosition;\n\t\t\t\tvarying vec3 vEdgeNormal;\n\t\t\t\tvarying vec3 vEdgeViewPosition;\n\t\t\t\t\n\t\t\t\tvoid main(){\n\t\t\t\t\tvec4 usf_DiffuseColor = vec4(1.0);\n\t\t\t\t\tfloat colorWobbleMix = smoothstep(-1.,1.,vWobble);\n\t\t\t\t\tvec2 colorPosMix = vec2(smoothstep(-1.,1.,vPosition.x),smoothstep(-1.,1.,vPosition.y));\n\t\t\t\t\n\t\t\t\t\tusf_DiffuseColor.rgb = mix(mix(uColor0, uColor1, colorPosMix.x), mix(uColor2, uColor3, colorPosMix.y), colorWobbleMix);\n\t\t\t\t`\n );\n\n // custom transmission\n if (mat.type === \"MeshPhysicalMaterial\" && isCustomTransmission) {\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `${transmission_pars_fragment}`\n );\n\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `${transmission_fragment}`\n );\n }\n\n setOnBeforeCompile(onBeforeCompile)(shader, renderer);\n };\n mat.needsUpdate = true;\n\n /*===============================================\n\t\tdepthMaterial\n\t\t===============================================*/\n const depthMat = new THREE.MeshDepthMaterial({\n depthPacking: THREE.RGBADepthPacking,\n });\n depthMat.onBeforeCompile = (shader, renderer) => {\n Object.assign(shader.uniforms, mat.userData.uniforms);\n shader.vertexShader = rewriteVertex(shader.vertexShader);\n setOnBeforeCompile(depthOnBeforeCompile)(shader, renderer);\n };\n depthMat.needsUpdate = true;\n\n return { material: mat, depthMaterial: depthMat };\n }, [\n materialParameters,\n baseMaterial,\n onBeforeCompile,\n depthOnBeforeCompile,\n uniforms,\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 onBeforeCompile,\n depthOnBeforeCompile,\n uniforms,\n}: UseCreateWobble3DProps &\n Create3DHooksProps &\n WobbleMaterialProps): UseCreateWobble3DReturn => {\n const wobbleGeometry = useMemo(() => {\n let geo = geometry || new THREE.IcosahedronGeometry(2, 20);\n geo = mergeVertices(geo);\n geo.computeTangents();\n return geo;\n }, [geometry]);\n const { material, depthMaterial } = useMaterial({\n baseMaterial,\n materialParameters,\n onBeforeCompile,\n depthOnBeforeCompile,\n uniforms,\n isCustomTransmission,\n });\n\n const mesh = useAddObject(scene, wobbleGeometry, material, THREE.Mesh);\n\n const userData = material.userData as Wobble3DMaterial;\n const updateValue = setUniform(userData);\n const 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 isSizeUpdate,\n camera,\n geometry,\n baseMaterial,\n materialParameters,\n uniforms,\n onBeforeCompile,\n depthOnBeforeCompile,\n isCustomTransmission,\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 uniforms,\n onBeforeCompile,\n depthOnBeforeCompile,\n isCustomTransmission,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n });\n\n const updateFx = useCallback(\n (\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","export type EasingTypes =\n | \"easeInSine\"\n | \"easeOutSine\"\n | \"easeInOutSine\"\n | \"easeInQuad\"\n | \"easeOutQuad\"\n | \"easeInOutQuad\"\n | \"easeInCubic\"\n | \"easeOutCubic\"\n | \"easeInOutCubic\"\n | \"easeInQuart\"\n | \"easeOutQuart\"\n | \"easeInOutQuart\"\n | \"easeInQuint\"\n | \"easeOutQuint\"\n | \"easeInOutQuint\"\n | \"easeInExpo\"\n | \"easeOutExpo\"\n | \"easeInOutExpo\"\n | \"easeInCirc\"\n | \"easeOutCirc\"\n | \"easeInOutCirc\"\n | \"easeInBack\"\n | \"easeOutBack\"\n | \"easeInOutBack\"\n | \"easeInElastic\"\n | \"easeOutElastic\"\n | \"easeInOutElastic\"\n | \"easeInBounce\"\n | \"easeOutBounce\"\n | \"easeInOutBounce\";\n\ntype EasingFunctions = {\n [K in EasingTypes]: (x: number) => number;\n};\n\n/**\n * from https://github.com/ai/easings.net\n */\nexport const Easing: EasingFunctions = Object.freeze({\n easeInSine(x: number): number {\n return 1 - Math.cos((x * Math.PI) / 2);\n },\n easeOutSine(x: number): number {\n return Math.sin((x * Math.PI) / 2);\n },\n easeInOutSine(x: number): number {\n return -(Math.cos(Math.PI * x) - 1) / 2;\n },\n easeInQuad(x: number): number {\n return x * x;\n },\n easeOutQuad(x: number): number {\n return 1 - (1 - x) * (1 - x);\n },\n easeInOutQuad(x: number): number {\n return x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2;\n },\n easeInCubic(x: number): number {\n return x * x * x;\n },\n easeOutCubic(x: number): number {\n return 1 - Math.pow(1 - x, 3);\n },\n easeInOutCubic(x: number): number {\n return x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2;\n },\n easeInQuart(x: number): number {\n return x * x * x * x;\n },\n easeOutQuart(x: number): number {\n return 1 - Math.pow(1 - x, 4);\n },\n easeInOutQuart(x: number): number {\n return x < 0.5 ? 8 * x * x * x * x : 1 - Math.pow(-2 * x + 2, 4) / 2;\n },\n easeInQuint(x: number): number {\n return x * x * x * x * x;\n },\n easeOutQuint(x: number): number {\n return 1 - Math.pow(1 - x, 5);\n },\n easeInOutQuint(x: number): number {\n return x < 0.5 ? 16 * x * x * x * x * x : 1 - Math.pow(-2 * x + 2, 5) / 2;\n },\n easeInExpo(x: number): number {\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\n },\n easeOutExpo(x: number): number {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n },\n easeInOutExpo(x: number): number {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? Math.pow(2, 20 * x - 10) / 2\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\n },\n easeInCirc(x: number): number {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n },\n easeOutCirc(x: number): number {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n },\n easeInOutCirc(x: number): number {\n return x < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\n },\n easeInBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return c3 * x * x * x - c1 * x * x;\n },\n easeOutBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return 1 + c3 * Math.pow(x - 1, 3) + c1 * Math.pow(x - 1, 2);\n },\n easeInOutBack(x: number): number {\n const c1 = 1.70158;\n const c2 = c1 * 1.525;\n\n return x < 0.5\n ? (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2\n : (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2;\n },\n easeInElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\n },\n easeOutElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1;\n },\n easeInOutElastic(x: number): number {\n const c5 = (2 * Math.PI) / 4.5;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * c5)) / 2\n : (Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * c5)) / 2 +\n 1;\n },\n easeInBounce(x: number): number {\n return 1 - Easing.easeOutBounce(1 - x);\n },\n easeOutBounce(x: number): number {\n const n1 = 7.5625;\n const d1 = 2.75;\n\n if (x < 1 / d1) {\n return n1 * x * x;\n } else if (x < 2 / d1) {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n } else if (x < 2.5 / d1) {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n } else {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n },\n easeInOutBounce(x: number): number {\n return x < 0.5\n ? (1 - Easing.easeOutBounce(1 - 2 * x)) / 2\n : (1 + Easing.easeOutBounce(2 * x - 1)) / 2;\n },\n});\n","import * as THREE from \"three\";\nimport { Easing, EasingTypes } from \"../libs/easing\";\nimport { useCallback } from \"react\";\n\n/** Returns a unique hash specific to the beat */\nfunction getHash(input: number) {\n let n = Math.sin(input * 12.9898) * 43758.5453;\n return n - Math.floor(n);\n}\n\ntype BeatValues = {\n beat: number;\n floor: number;\n fract: number;\n /** unique hash specific to the beat */\n hash: number;\n};\n\n/**\n * @param ease easing functions are referenced from https://github.com/ai/easings.net , default : \"easeOutQuart\"\n */\nexport const useBeat = (bpm: number, ease: EasingTypes = \"easeOutQuart\") => {\n const rhythm = bpm / 60;\n const easing = Easing[ease];\n const updateBeat = useCallback(\n (clock: THREE.Clock) => {\n let beat = clock.getElapsedTime() * rhythm;\n const floor = Math.floor(beat);\n const fract = easing(beat - floor);\n beat = fract + floor;\n const hash = getHash(floor);\n return {\n beat,\n floor,\n fract,\n hash,\n } as BeatValues;\n },\n [rhythm, easing]\n );\n return updateBeat;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo, useRef } from \"react\";\n\n/**\n * @param fps FPS you want to limit , default : `60`\n *\n * ```tsx\n * const limiter = useFPSLimiter(fps);\n * useFrame((props) => {\n * if (limiter(props.clock)) {\n *\t\t //some code\n * }\n * });\n * ```\n */\nexport const useFPSLimiter = (fps: number = 60) => {\n const interval = useMemo(() => 1 / Math.max(Math.min(fps, 60), 1), [fps]);\n const prevTime = useRef(null);\n\n const limiter = useCallback(\n (clock: THREE.Clock) => {\n const tick = clock.getElapsedTime();\n if (prevTime.current === null) {\n prevTime.current = tick;\n return true;\n }\n const deltaTime = tick - prevTime.current;\n if (deltaTime >= interval) {\n prevTime.current = tick;\n return true;\n }\n return false;\n },\n [interval]\n );\n\n return limiter;\n};\n","import { DomSyncerParams } from \"..\";\n\nexport const errorHandler = (params: DomSyncerParams) => {\n const domLength = params.dom?.length;\n const textureLength = params.texture?.length;\n\n if (!domLength || !textureLength) {\n return true;\n }\n\n if (domLength !== textureLength) {\n return true;\n }\n\n return false;\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec2 u_textureResolution;\nuniform vec2 u_resolution;\nuniform float u_borderRadius;\n\nvoid main() {\n\t// texuture color\n\tfloat screenAspect = u_resolution.x / u_resolution.y;\n\tfloat textureAspect = u_textureResolution.x / u_textureResolution.y;\n\tvec2 ratio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\n\tvec2 adjustedUv = vUv * ratio + (1.0 - ratio) * 0.5;\n\tvec3 textureColor = texture2D(u_texture, adjustedUv).rgb;\n\tfloat textureAlpha = texture2D(u_texture, adjustedUv).a;\n\n\t// Based on https://mofu-dev.com/en/blog/three-dom-alignment/\n\tfloat maxSide = max(u_resolution.x, u_resolution.y);\n\tfloat minSide = min(u_resolution.x, u_resolution.y);\n\tvec2 aspect = u_resolution / maxSide;\n\tvec2 alphaUv = vUv - 0.5;\n\n\tfloat borderRadius = min(u_borderRadius, minSide * 0.5);\n\tvec2 offset = vec2(borderRadius) / u_resolution;\n\tvec2 alphaXY = smoothstep(vec2(0.5 - offset), vec2(0.5 - offset - 0.001), abs(alphaUv));\n\tfloat alpha = min(1.0, alphaXY.x + alphaXY.y);\n\n\tvec2 alphaUv2 = abs(vUv - 0.5);\n\tfloat radius = borderRadius / maxSide;\n\talphaUv2 = (alphaUv2 - 0.5) * aspect + radius;\n\tfloat roundAlpha = smoothstep(radius + 0.001, radius, length(alphaUv2));\n\n\talpha = min(1.0, alpha + roundAlpha);\n\n\t// multiply texture alpha\n\talpha *= textureAlpha;\n\n\tgl_FragColor = vec4(textureColor, alpha);\n}\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"../\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"../shader/main.vert\";\nimport fragmentShader from \"../shader/main.frag\";\nimport { MaterialProps } from \"../../../fxs/types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../libs/constants\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n params: DomSyncerParams;\n size: Size;\n scene: THREE.Scene;\n} & MaterialProps) => {\n if (scene.children.length > 0) {\n scene.children.forEach((child) => {\n if (child instanceof THREE.Mesh) {\n child.geometry.dispose();\n child.material.dispose();\n }\n });\n scene.remove(...scene.children);\n }\n\n params.texture!.forEach((texture, i) => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: texture },\n u_textureResolution: {\n value: new THREE.Vector2(0, 0),\n },\n u_resolution: { value: new THREE.Vector2(0, 0) },\n u_borderRadius: {\n value: params.boderRadius![i] ? params.boderRadius![i] : 0.0,\n },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent.\n transparent: true,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n const mesh = new THREE.Mesh(new THREE.PlaneGeometry(1, 1), mat);\n scene.add(mesh);\n });\n};\n","import { useCallback, useRef } from \"react\";\nimport { DomSyncerParams } from \"..\";\n\nexport const useIntersectionHandler = () => {\n const intersectionObserverRef = useRef([]);\n const intersectionDomRef = useRef<(HTMLElement | Element | null)[]>([]);\n\n const intersectionHandler = useCallback(\n ({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n }: {\n isIntersectingRef: React.MutableRefObject;\n isIntersectingOnceRef: React.MutableRefObject;\n params: DomSyncerParams;\n }) => {\n if (intersectionObserverRef.current.length > 0) {\n intersectionObserverRef.current.forEach((observer, i) => {\n observer.unobserve(intersectionDomRef.current[i]!);\n });\n }\n\n intersectionDomRef.current = [];\n intersectionObserverRef.current = [];\n\n const newArr = new Array(params.dom!.length).fill(false);\n isIntersectingRef.current = [...newArr];\n isIntersectingOnceRef.current = [...newArr];\n\n params.dom!.forEach((dom, i) => {\n const callback = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n params.onIntersect![i] && params.onIntersect![i](entry);\n // Update the judgment after execution so that the judgment of isIntersectin can be used when executing onIntersect\n isIntersectingRef.current[i] = entry.isIntersecting;\n });\n };\n const observer = new IntersectionObserver(callback, {\n rootMargin: \"0px\",\n threshold: 0,\n });\n observer.observe(dom!);\n intersectionObserverRef.current.push(observer);\n intersectionDomRef.current.push(dom!);\n });\n },\n []\n );\n\n return intersectionHandler;\n};\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"..\";\nimport { Size } from \"@react-three/fiber\";\nimport {\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, samples, isSizeUpdate, uniforms, onBeforeCompile }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n const [params, setParams] = useParams({\n ...DOMSYNCER_PARAMS,\n updateKey: performance.now(),\n });\n\n const [DOMRects, updateDomRects] = useUpdateDomRect();\n\n // Avoid instancing vec2 every frame\n const resolutionRef = useRef(new THREE.Vector2(0, 0));\n\n // Update monitored doms according to the dependency array\n const [refreshTrigger, setRefreshTrigger] = useState(true);\n useMemo(\n () => setRefreshTrigger(true),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n dependencies\n );\n\n // If the dependencies have been updated but the key has not been updated, skip processing and return an empty texture\n const updateKey = useRef(null);\n const emptyTexture = useMemo(() => 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 uniforms,\n onBeforeCompile,\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 uniforms,\n intersectionHandler,\n onBeforeCompile,\n refreshTrigger,\n scene,\n params,\n isIntersectingOnceRef,\n isIntersectingRef,\n emptyTexture,\n updateParams,\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 { UseFboProps, renderFBO, FBO_OPTION } from \"../utils/useSingleFBO\";\n\ntype UpdateCopyFunction = (\n gl: THREE.WebGLRenderer,\n index: number,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseCopyTextureReturn = [THREE.WebGLRenderTarget[], UpdateCopyFunction];\n\n/**\n * Generate an FBO array to copy the texture.\n * @param dpr If dpr is set, dpr will be multiplied, default : `false`\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false`\n * @param length The number of FBOs to create\n * @returns [THREE.WebGLRenderTarget[] , updateCopyTexture] - Receives the RenderTarget array as the first argument and the update function as the second argument. `updateCopyTexture()` receives gl as the first argument and the index of the texture you want to copy as the second argument.\n */\nexport const useCopyTexture = (\n {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n }: UseFboProps,\n length: number\n): UseCopyTextureReturn => {\n const renderTargetArr = useRef([]);\n const resolution = useResolution(size, dpr);\n\n renderTargetArr.current = useMemo(() => {\n return Array.from({ length }, () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [length]);\n\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","setUniform","material","key","value","uniforms","setCustomUniform","customParams","useAddObject","scene","geometry","Proto","object3D","obj","useEffect","ISDEV","MATERIAL_BASIC_PARAMS","DEFAULT_TEXTURE","wobble3D_default","snoise_default","coverTexture_default","fxBlending_default","planeVert_default","SHADER_CHUNK","wobble3D","snoise","coverTexture","fxBlending","planeVert","includePattern","includeReplacer","match","include","string","resolveIncludes","resolveShaders","parameters","setOnBeforeCompile","onBeforeCompile","renderer","useMesh","mat","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_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","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","iterations","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","mergeVertices","tolerance","hashToIndex","indices","vertexCount","nextIndex","attributeNames","attrArrays","morphAttrsArrays","newIndices","getters","l","name","morphAttr","decimalShift","shiftMultiplier","hash","k","newarray","newMorphArrays","getterFunc","m","ml","result","oldAttribute","buffer","BufferAttribute","oldMorphAttribute","buffer2","morphAttribute","transmission_pars_fragment_default","transmission_fragment_default","rewriteVertex","vertex","shader","baseMaterial","materialParameters","depthOnBeforeCompile","isCustomTransmission","depthMaterial","WOBBLE3D_PARAMS","transmission_pars_fragment","transmission_fragment","depthMat","useCreateWobble3D","wobbleGeometry","userData","useWobble3D","RootState","useAddMesh","Easing","x","c2","c4","c5","getHash","input","n","useBeat","bpm","ease","rhythm","easing","beat","floor","fract","useFPSLimiter","fps","interval","prevTime","tick","errorHandler","domLength","textureLength","createMesh","child","useIntersectionHandler","intersectionObserverRef","intersectionDomRef","isIntersectingRef","isIntersectingOnceRef","observer","newArr","dom","callback","entries","entry","useUpdateDomRect","domRects","updateDomRects","resolutionRef","domElement","rect","useIsIntersecting","isIntersecting","once","createUseDomView","onView","onHidden","isView","id","filterIntersection","item","DOMSYNCER_PARAMS","useDomSyncer","dependencies","DOMRects","refreshTrigger","setRefreshTrigger","useState","updateKey","emptyTexture","intersectionHandler","useDomView","useCopyTexture","length","renderTargetArr","updateCopyTexture"],"mappings":"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","x_google_ignoreList":[123]} \ 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 new file mode 100644 index 00000000..a32273fc --- /dev/null +++ b/packages/use-shader-fx/build/use-shader-fx.umd.cjs @@ -0,0 +1,1571 @@ +(function(C,ue){typeof exports=="object"&&typeof module<"u"?ue(exports,require("three"),require("react")):typeof define=="function"&&define.amd?define(["exports","three","react"],ue):(C=typeof globalThis<"u"?globalThis:C||self,ue(C["use-shader-fx"]={},C.THREE,C.React))})(this,function(C,ue,i){"use strict";function $e(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 o=$e(ue);var je="#usf ",We=`precision highp float; + +uniform sampler2D uBuffer; +uniform sampler2D uTexture; +uniform bool uIsTexture; +uniform sampler2D uMap; +uniform bool uIsMap; +uniform float uMapIntensity; +uniform float uRadius; +uniform float uDissipation; +uniform vec2 uResolution; +uniform float uSmudge; +uniform vec2 uMouse; +uniform vec2 uPrevMouse; +uniform vec2 uVelocity; +uniform vec3 uColor; +uniform float uMotionBlur; +uniform int uMotionSample; +uniform bool uIsCursor; +uniform float uPressureStart; +uniform float uPressureEnd; + +varying vec2 vUv; + +float isOnLine(vec2 point, vec2 start, vec2 end, float radius, float pressureStart, float pressureEnd) { + + float aspect = uResolution.x / uResolution.y; + + point.x *= aspect; + start.x *= aspect; + end.x *= aspect; + + vec2 dir = normalize(end - start); + vec2 n = vec2(dir.y, -dir.x); + vec2 p0 = point - start; + + float distToLine = abs(dot(p0, n)); + float distAlongLine = dot(p0, dir); + float totalLength = length(end - start); + + float progress = clamp(distAlongLine / totalLength, 0.0, 1.0); + float pressure = mix(pressureStart, pressureEnd, progress); + radius = min(radius,radius * pressure); + + float distFromStart = length(point - start); + float distFromEnd = length(point - end); + + bool withinLine = (distToLine < radius && distAlongLine > 0.0 && distAlongLine < totalLength) || distFromStart < radius || distFromEnd < radius; + + return float(withinLine); +} + +vec4 createSmudge(vec2 uv){ + vec2 offsets[9]; + offsets[0] = vec2(-1, -1); offsets[1] = vec2( 0, -1); offsets[2] = vec2( 1, -1); + offsets[3] = vec2(-1, 0); offsets[4] = vec2( 0, 0); offsets[5] = vec2( 1, 0); + offsets[6] = vec2(-1, 1); offsets[7] = vec2( 0, 1); offsets[8] = vec2( 1, 1); + + for(int i = 0; i < 9; i++) { + offsets[i] = (offsets[i] * uSmudge) / uResolution; + } + vec4 smudgedColor = vec4(0.); + for(int i = 0; i < 9; i++) { + smudgedColor += texture2D(uBuffer, uv + offsets[i]); + } + return smudgedColor / 9.0; +} + +vec4 createMotionBlur(vec2 uv , vec4 baseColor, vec2 velocity) { + vec2 scaledV = velocity * uMotionBlur; + for(int i = 1; i < uMotionSample; i++) { + float t = float(i) / float(uMotionSample - 1); + vec2 offset = t * scaledV / uResolution; + baseColor += texture2D(uBuffer, uv + offset); + } + return baseColor / float(uMotionSample); +} + +void main() { + + vec2 uv = vUv; + if(uIsMap){ + vec2 mapColor = texture2D(uMap, uv).rg; + vec2 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; + } + vec2 suv = uv*2.-1.; + + vec2 velocity = uVelocity * uResolution; + + float radius = max(0.0,uRadius); + + vec4 smudgedColor = uSmudge > 0. ? createSmudge(uv) : texture2D(uBuffer, uv); + + vec4 motionBlurredColor = uMotionBlur > 0. ? createMotionBlur(uv,smudgedColor, velocity) : smudgedColor; + + vec4 bufferColor = motionBlurredColor; + bufferColor.a = bufferColor.a < 1e-10 ? 0.0 : bufferColor.a * uDissipation; + + vec4 brushColor = uIsTexture ? texture2D(uTexture, uv) : vec4(uColor,1.); + + float onLine = isOnLine(suv, uPrevMouse, uMouse, radius, uPressureStart,uPressureEnd); + float isOnLine = length(velocity) > 0. ? onLine : uIsCursor ? onLine : 0.; + + vec4 finalColor = mix(bufferColor, brushColor, isOnLine); + + gl_FragColor = finalColor; +}`;const X=(e,n=!1)=>{const t=n?e.width*n:e.width,r=n?e.height*n:e.height;return i.useMemo(()=>new o.Vector2(t,r),[t,r])},R=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 u=i.useMemo(()=>{const m=new r(n,t);return e&&e.add(m),m},[n,t,r,e]);return i.useEffect(()=>()=>{e&&e.remove(u),n.dispose(),t.dispose()},[e,n,t,u]),u},De=process.env.NODE_ENV==="development",z={transparent:!1,depthTest:!1,depthWrite:!1},D=new o.DataTexture(new Uint8Array([0,0,0,0]),1,1,o.RGBAFormat);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;} + +vec4 grad4(float j, vec4 ip) +{ + const vec4 ones = vec4(1.0, 1.0, 1.0, -1.0); + vec4 p,s; + + p.xyz = floor( fract (vec3(j) * ip.xyz) * 7.0) * ip.z - 1.0; + p.w = 1.5 - dot(abs(p.xyz), ones.xyz); + s = vec4(lessThan(p, vec4(0.0))); + p.xyz = p.xyz + (s.xyz*2.0 - 1.0) * s.www; + + return p; +} + +float simplexNoise4d(vec4 v) +{ + const vec2 C = vec2( 0.138196601125010504, + 0.309016994374947451); + + vec4 i = floor(v + dot(v, C.yyyy) ); + vec4 x0 = v - i + dot(i, C.xxxx); + + + + + vec4 i0; + + vec3 isX = step( x0.yzw, x0.xxx ); + vec3 isYZ = step( x0.zww, x0.yyz ); + + i0.x = isX.x + isX.y + isX.z; + i0.yzw = 1.0 - isX; + + + i0.y += isYZ.x + isYZ.y; + i0.zw += 1.0 - isYZ.xy; + + i0.z += isYZ.z; + i0.w += 1.0 - isYZ.z; + + + vec4 i3 = clamp( i0, 0.0, 1.0 ); + vec4 i2 = clamp( i0-1.0, 0.0, 1.0 ); + vec4 i1 = clamp( i0-2.0, 0.0, 1.0 ); + + + vec4 x1 = x0 - i1 + 1.0 * C.xxxx; + vec4 x2 = x0 - i2 + 2.0 * C.xxxx; + vec4 x3 = x0 - i3 + 3.0 * C.xxxx; + vec4 x4 = x0 - 1.0 + 4.0 * C.xxxx; + + + i = mod(i, 289.0); + float j0 = permute( permute( permute( permute(i.w) + i.z) + i.y) + i.x); + vec4 j1 = permute( permute( permute( permute ( + i.w + vec4(i1.w, i2.w, i3.w, 1.0 )) + + i.z + vec4(i1.z, i2.z, i3.z, 1.0 )) + + i.y + vec4(i1.y, i2.y, i3.y, 1.0 )) + + i.x + vec4(i1.x, i2.x, i3.x, 1.0 )); + + + + + vec4 ip = vec4(1.0/294.0, 1.0/49.0, 1.0/7.0, 0.0) ; + + vec4 p0 = grad4(j0, ip); + vec4 p1 = grad4(j1.x, ip); + vec4 p2 = grad4(j1.y, ip); + vec4 p3 = grad4(j1.z, ip); + vec4 p4 = grad4(j1.w, ip); + + + vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3))); + p0 *= norm.x; + p1 *= norm.y; + p2 *= norm.z; + p3 *= norm.w; + p4 *= taylorInvSqrt(dot(p4,p4)); + + + vec3 m0 = max(0.6 - vec3(dot(x0,x0), dot(x1,x1), dot(x2,x2)), 0.0); + vec2 m1 = max(0.6 - vec2(dot(x3,x3), dot(x4,x4) ), 0.0); + m0 = m0 * m0; + m1 = m1 * m1; + return 49.0 * ( dot(m0*m0, vec3( dot( p0, x0 ), dot( p1, x1 ), dot( p2, x2 ))) + + dot(m1*m1, vec2( dot( p3, x3 ), dot( p4, x4 ) ) ) ) ; + +} + +float getWobble(vec3 position) +{ + vec3 warpedPosition = position; + warpedPosition += simplexNoise4d( + vec4( + position * uWarpPositionFrequency, + uTime * uWarpTimeFrequency + ) + ) * uWarpStrength; + + return simplexNoise4d(vec4( + warpedPosition * uWobblePositionFrequency, + uTime * uWobbleTimeFrequency + )) * uWobbleStrength; +}`,Ne=`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); + j *= .125; + r.x = fract(512.0*j); + j *= .125; + r.y = fract(512.0*j); + return r-0.5; +} + +const float F3 = 0.3333333; +const float G3 = 0.1666667; + +float snoise(vec3 p) { + + vec3 s = floor(p + dot(p, vec3(F3))); + vec3 x = p - s + dot(s, vec3(G3)); + + vec3 e = step(vec3(0.0), x - x.yzx); + vec3 i1 = e*(1.0 - e.zxy); + vec3 i2 = 1.0 - e.zxy*(1.0 - e); + + vec3 x1 = x - i1 + G3; + vec3 x2 = x - i2 + 2.0*G3; + vec3 x3 = x - 1.0 + 3.0*G3; + + vec4 w, d; + + w.x = dot(x, x); + w.y = dot(x1, x1); + w.z = dot(x2, x2); + w.w = dot(x3, x3); + + w = max(0.6 - w, 0.0); + + d.x = dot(random3(s), x); + d.y = dot(random3(s + i1), x1); + d.z = dot(random3(s + i2), x2); + d.w = dot(random3(s + 1.0), x3); + + w *= w; + w *= w; + d *= w; + + return dot(d, vec4(52.0)); +} + +float snoiseFractal(vec3 m) { + return 0.5333333* snoise(m) + +0.2666667* snoise(2.0*m) + +0.1333333* snoise(4.0*m) + +0.0666667* snoise(8.0*m); +}`,Ge=`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; +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;`,Xe=`precision highp float; + +varying vec2 vUv; + +void main() { + vUv = uv; + gl_Position = vec4(position, 1.0); +}`;const He={wobble3D:qe,snoise:Ne,coverTexture:Ge,fxBlending:Ke,planeVert:Xe},Ye=/^[ \t]*#usf +<([\w\d./]+)>/gm;function Qe(e,n){let t=He[n]||"";return be(t)}function be(e){return e.replace(Ye,Qe)}const Ze=e=>{e.vertexShader=be(e.vertexShader),e.fragmentShader=be(e.fragmentShader)},B=e=>(n,t)=>{e&&e(n,t),Ze(n)},Je=({scene:e,size:n,dpr:t,uniforms:r,onBeforeCompile:u})=>{const m=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),l=i.useMemo(()=>{const g=new o.ShaderMaterial({uniforms:{uBuffer:{value:D},uResolution:{value:new o.Vector2(0,0)},uTexture:{value:D},uIsTexture:{value:!1},uMap:{value:D},uIsMap:{value:!1},uMapIntensity:{value:Z.mapIntensity},uRadius:{value:Z.radius},uSmudge:{value:Z.smudge},uDissipation:{value:Z.dissipation},uMotionBlur:{value:Z.motionBlur},uMotionSample:{value:Z.motionSample},uMouse:{value:new o.Vector2(-10,-10)},uPrevMouse:{value:new o.Vector2(-10,-10)},uVelocity:{value:new o.Vector2(0,0)},uColor:{value:Z.color},uIsCursor:{value:!1},uPressureStart:{value:1},uPressureEnd:{value:1},...r},vertexShader:je,fragmentShader:We,...z,transparent:!0});return g.onBeforeCompile=B(u),g},[u,r]),s=X(n,t);R(l)("uResolution",s.clone());const v=L(e,m,l,o.Mesh);return{material:l,mesh:v}},en=(e,n)=>{const t=n,r=e/n,[u,m]=[t*r/2,t/2];return{width:u,height:m,near:-1e3,far:1e3}},k=(e,n="OrthographicCamera")=>{const t=X(e),{width:r,height:u,near:m,far:l}=en(t.x,t.y);return i.useMemo(()=>n==="OrthographicCamera"?new o.OrthographicCamera(-r,r,u,-u,m,l):new o.PerspectiveCamera(50,r/u),[r,u,m,l,n])},ge=(e=0)=>{const n=i.useRef(new o.Vector2(0,0)),t=i.useRef(new o.Vector2(0,0)),r=i.useRef(new o.Vector2(0,0)),u=i.useRef(0),m=i.useRef(new o.Vector2(0,0)),l=i.useRef(!1);return i.useCallback(v=>{const g=performance.now();let d;l.current&&e?(r.current=r.current.lerp(v,1-e),d=r.current.clone()):(d=v.clone(),r.current=d),u.current===0&&(u.current=g,n.current=d);const y=Math.max(1,g-u.current);u.current=g,m.current.copy(d).sub(n.current).divideScalar(y);const M=m.current.length()>0,a=l.current?n.current.clone():d;return!l.current&&M&&(l.current=!0),n.current=d,{currentPointer:d,prevPointer:a,diffPointer:t.current.subVectors(d,a),velocity:m.current,isVelocityUpdate:M}},[e])},$=e=>{const n=u=>Object.values(u).some(m=>typeof m=="function"),t=i.useRef(n(e)?e:structuredClone(e)),r=i.useCallback(u=>{if(u!==void 0)for(const m in u){const l=m;l in t.current&&u[l]!==void 0&&u[l]!==null?t.current[l]=u[l]:console.error(`"${String(l)}" does not exist in the params. or "${String(l)}" is null | undefined`)}},[]);return[t.current,r]},me={minFilter:o.LinearFilter,magFilter:o.LinearFilter,type:o.HalfFloatType,stencilBuffer:!1},he=({gl:e,fbo:n,scene:t,camera:r,onBeforeRender:u,onSwap:m})=>{e.setRenderTarget(n),u(),e.clear(),e.render(t,r),m&&m(),e.setRenderTarget(null),e.clear()},j=({scene:e,camera:n,size:t,dpr:r=!1,isSizeUpdate:u=!1,samples:m=0,depthBuffer:l=!1,depthTexture:s=!1})=>{var y;const v=i.useRef(),g=X(t,r);v.current=i.useMemo(()=>{const M=new o.WebGLRenderTarget(g.x,g.y,{...me,samples:m,depthBuffer:l});return s&&(M.depthTexture=new o.DepthTexture(g.x,g.y,o.FloatType)),M},[]),u&&((y=v.current)==null||y.setSize(g.x,g.y)),i.useEffect(()=>{const M=v.current;return()=>{M==null||M.dispose()}},[]);const d=i.useCallback((M,a)=>{const h=v.current;return he({gl:M,fbo:h,scene:e,camera:n,onBeforeRender:()=>a&&a({read:h.texture})}),h.texture},[e,n]);return[v.current,d]},re=({scene:e,camera:n,size:t,dpr:r=!1,isSizeUpdate:u=!1,samples:m=0,depthBuffer:l=!1,depthTexture:s=!1})=>{var M,a;const v=i.useRef({read:null,write:null,swap:function(){let h=this.read;this.read=this.write,this.write=h}}),g=X(t,r),d=i.useMemo(()=>{const h=new o.WebGLRenderTarget(g.x,g.y,{...me,samples:m,depthBuffer:l}),c=new o.WebGLRenderTarget(g.x,g.y,{...me,samples:m,depthBuffer:l});return s&&(h.depthTexture=new o.DepthTexture(g.x,g.y,o.FloatType),c.depthTexture=new o.DepthTexture(g.x,g.y,o.FloatType)),{read:h,write:c}},[]);v.current.read=d.read,v.current.write=d.write,u&&((M=v.current.read)==null||M.setSize(g.x,g.y),(a=v.current.write)==null||a.setSize(g.x,g.y)),i.useEffect(()=>{const h=v.current;return()=>{var c,p;(c=h.read)==null||c.dispose(),(p=h.write)==null||p.dispose()}},[]);const y=i.useCallback((h,c)=>{var f;const p=v.current;return he({gl:h,scene:e,camera:n,fbo:p.write,onBeforeRender:()=>c&&c({read:p.read.texture,write:p.write.texture}),onSwap:()=>p.swap()}),(f=p.read)==null?void 0:f.texture},[e,n]);return[{read:v.current.read,write:v.current.write},y]},U=e=>typeof e=="number"?{shader:e,fbo:e}:{shader:e.shader??!1,fbo:e.fbo??!1},Z=Object.freeze({texture:!1,map:!1,mapIntensity:.1,radius:.05,smudge:0,dissipation:1,motionBlur:0,motionSample:5,color:new o.Vector3(1,0,0),isCursor:!1,pressure:1,pointerValues:!1}),nn=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=Je({scene:s,size:e,dpr:l.shader,uniforms:u,onBeforeCompile:m}),d=k(e),y=ge(),[M,a]=re({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[h,c]=$(Z),p=i.useRef(null),f=R(v),w=V(v),b=i.useCallback((S,_)=>{c(S),w(_)},[c,w]);return[i.useCallback((S,_,T)=>{const{gl:I,pointer:A}=S;b(_,T),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 F=h.pointerValues||y(A);F.isVelocityUpdate&&(f("uMouse",F.currentPointer),f("uPrevMouse",F.prevPointer)),f("uVelocity",F.velocity);const P=typeof h.color=="function"?h.color(F.velocity):h.color;return f("uColor",P),f("uIsCursor",h.isCursor),f("uPressureEnd",h.pressure),p.current===null&&(p.current=h.pressure),f("uPressureStart",p.current),p.current=h.pressure,a(I,({read:O})=>{f("uBuffer",O)})},[f,y,a,h,b]),b,{scene:s,mesh:g,material:v,camera:d,renderTarget:M,output:M.read.texture}]};var J=`varying vec2 vUv; +varying vec2 vL; +varying vec2 vR; +varying vec2 vT; +varying vec2 vB; +uniform vec2 texelSize; + +void main () { + vUv = uv; + vL = vUv - vec2(texelSize.x, 0.0); + vR = vUv + vec2(texelSize.x, 0.0); + vT = vUv + vec2(0.0, texelSize.y); + vB = vUv - vec2(0.0, texelSize.y); + gl_Position = vec4(position, 1.0); +}`,tn=`precision highp float; + +void main(){ + gl_FragColor = vec4(0.0); +}`;const rn=()=>i.useMemo(()=>new o.ShaderMaterial({vertexShader:J,fragmentShader:tn,...z}),[]);var on=`precision highp float; + +varying vec2 vUv; +uniform sampler2D uVelocity; +uniform sampler2D uSource; +uniform vec2 texelSize; +uniform float dt; +uniform float dissipation; + +void main () { + vec2 coord = vUv - dt * texture2D(uVelocity, vUv).xy * texelSize; + gl_FragColor = vec4(dissipation * texture2D(uSource, coord).rgb,1.); +}`;const an=({onBeforeCompile:e,uniforms:n})=>i.useMemo(()=>{const r=new o.ShaderMaterial({uniforms:{uVelocity:{value:D},uSource:{value:D},texelSize:{value:new o.Vector2},dt:{value:Se},dissipation:{value:0},...n},vertexShader:J,fragmentShader:on,...z});return r.onBeforeCompile=B(e),r},[e,n]);var un=`precision highp float; + +varying vec2 vUv; +varying vec2 vL; +varying vec2 vR; +varying vec2 vT; +varying vec2 vB; +uniform sampler2D uVelocity; + +vec2 sampleVelocity(in vec2 uv) { + vec2 clampedUV = clamp(uv, 0.0, 1.0); + vec2 multiplier = vec2(1.0, 1.0); + multiplier.x = uv.x < 0.0 || uv.x > 1.0 ? -1.0 : 1.0; + multiplier.y = uv.y < 0.0 || uv.y > 1.0 ? -1.0 : 1.0; + return multiplier * texture2D(uVelocity, clampedUV).xy; +} + +void main () { + float L = sampleVelocity(vL).x; + float R = sampleVelocity(vR).x; + float T = sampleVelocity(vT).y; + float B = sampleVelocity(vB).y; + float div = 0.5 * (R - L + T - B); + gl_FragColor = vec4(div, 0.0, 0.0, 1.0); +}`;const sn=({onBeforeCompile:e,uniforms:n})=>i.useMemo(()=>{const r=new o.ShaderMaterial({uniforms:{uVelocity:{value:null},texelSize:{value:new o.Vector2},...n},vertexShader:J,fragmentShader:un,...z});return r.onBeforeCompile=B(e),r},[e,n]);var ln=`precision highp float; + +varying vec2 vUv; +varying vec2 vL; +varying vec2 vR; +varying vec2 vT; +varying vec2 vB; +uniform sampler2D uPressure; +uniform sampler2D uDivergence; + +void main () { + float L = texture2D(uPressure, clamp(vL,0.,1.)).x; + float R = texture2D(uPressure, clamp(vR,0.,1.)).x; + float T = texture2D(uPressure, clamp(vT,0.,1.)).x; + float B = texture2D(uPressure, clamp(vB,0.,1.)).x; + float C = texture2D(uPressure, vUv).x; + 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 cn=({onBeforeCompile:e,uniforms:n})=>i.useMemo(()=>{const r=new o.ShaderMaterial({uniforms:{uPressure:{value:null},uDivergence:{value:null},texelSize:{value:new o.Vector2},...n},vertexShader:J,fragmentShader:ln,...z});return r.onBeforeCompile=B(e),r},[e,n]);var vn=`precision highp float; + +varying vec2 vUv; +varying vec2 vL; +varying vec2 vR; +varying vec2 vT; +varying vec2 vB; +uniform sampler2D uVelocity; + +void main () { + float L = texture2D(uVelocity, vL).y; + float R = texture2D(uVelocity, vR).y; + float T = texture2D(uVelocity, vT).x; + float B = texture2D(uVelocity, vB).x; + float vorticity = R - L - T + B; + gl_FragColor = vec4(vorticity, 0.0, 0.0, 1.0); +}`;const mn=({onBeforeCompile:e,uniforms:n})=>i.useMemo(()=>{const r=new o.ShaderMaterial({uniforms:{uVelocity:{value:null},texelSize:{value:new o.Vector2},...n},vertexShader:J,fragmentShader:vn,...z});return r.onBeforeCompile=B(e),r},[e,n]);var pn=`precision highp float; + +varying vec2 vUv; +varying vec2 vT; +varying vec2 vB; +uniform sampler2D uVelocity; +uniform sampler2D uCurl; +uniform float curl; +uniform float dt; + +void main () { + float T = texture2D(uCurl, vT).x; + float B = texture2D(uCurl, vB).x; + float C = texture2D(uCurl, vUv).x; + vec2 force = vec2(abs(T) - abs(B), 0.0); + 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 fn=({onBeforeCompile:e,uniforms:n})=>i.useMemo(()=>{const r=new o.ShaderMaterial({uniforms:{uVelocity:{value:null},uCurl:{value:null},curl:{value:0},dt:{value:Se},texelSize:{value:new o.Vector2},...n},vertexShader:J,fragmentShader:pn,...z});return r.onBeforeCompile=B(e),r},[e,n]);var dn=`precision highp float; + +varying vec2 vUv; +uniform sampler2D uTexture; +uniform float value; + +void main () { + gl_FragColor = value * texture2D(uTexture, vUv); +}`;const gn=({onBeforeCompile:e,uniforms:n})=>i.useMemo(()=>{const r=new o.ShaderMaterial({uniforms:{uTexture:{value:D},value:{value:0},texelSize:{value:new o.Vector2},...n},vertexShader:J,fragmentShader:dn,...z});return r.onBeforeCompile=B(e),r},[e,n]);var hn=`precision highp float; + +varying vec2 vUv; +varying vec2 vL; +varying vec2 vR; +varying vec2 vT; +varying vec2 vB; +uniform sampler2D uPressure; +uniform sampler2D uVelocity; + +void main () { + float L = texture2D(uPressure, clamp(vL,0.,1.)).x; + float R = texture2D(uPressure, clamp(vR,0.,1.)).x; + float T = texture2D(uPressure, clamp(vT,0.,1.)).x; + float B = texture2D(uPressure, clamp(vB,0.,1.)).x; + vec2 velocity = texture2D(uVelocity, vUv).xy; + velocity.xy -= vec2(R - L, T - B); + gl_FragColor = vec4(velocity, 0.0, 1.0); +}`;const xn=({onBeforeCompile:e,uniforms:n})=>i.useMemo(()=>{const r=new o.ShaderMaterial({uniforms:{uPressure:{value:D},uVelocity:{value:D},texelSize:{value:new o.Vector2},...n},vertexShader:J,fragmentShader:hn,...z});return r.onBeforeCompile=B(e),r},[e,n]);var Mn=`precision highp float; + +varying vec2 vUv; +uniform sampler2D uTarget; +uniform float aspectRatio; +uniform vec3 color; +uniform vec2 point; +uniform float radius; + +void main () { + vec2 nPoint = (point + vec2(1.0)) * 0.5; + vec2 p = vUv - nPoint.xy; + p.x *= aspectRatio; + vec3 splat = exp(-dot(p, p) / radius) * color; + vec3 base = texture2D(uTarget, vUv).xyz; + gl_FragColor = vec4(base + splat, 1.0); +}`;const yn=({onBeforeCompile:e,uniforms:n})=>i.useMemo(()=>{const r=new o.ShaderMaterial({uniforms:{uTarget:{value:D},aspectRatio:{value:0},color:{value:new o.Vector3},point:{value:new o.Vector2},radius:{value:0},texelSize:{value:new o.Vector2},...n},vertexShader:J,fragmentShader:Mn,...z});return r.onBeforeCompile=B(e),r},[e,n]),ee=(e,n)=>e(n??{}),bn=({scene:e,size:n,dpr:t,customFluidProps:r})=>{const u=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),{curl:m,vorticity:l,advection:s,divergence:v,pressure:g,clear:d,gradientSubtract:y,splat:M}=r??{},a=ee(rn),h=a.clone(),c=ee(mn,m),p=ee(fn,l),f=ee(an,s),w=ee(sn,v),b=ee(cn,g),x=ee(gn,d),S=ee(xn,y),_=ee(yn,M),T=i.useMemo(()=>({vorticityMaterial:p,curlMaterial:c,advectionMaterial:f,divergenceMaterial:w,pressureMaterial:b,clearMaterial:x,gradientSubtractMaterial:S,splatMaterial:_}),[p,c,f,w,b,x,S,_]),I=X(n,t);i.useMemo(()=>{R(T.splatMaterial)("aspectRatio",I.x/I.y);for(const P of Object.values(T))R(P)("texelSize",new o.Vector2(1/I.x,1/I.y))},[I,T]);const A=L(e,u,a,o.Mesh);i.useMemo(()=>{a.dispose(),A.material=h},[a,A,h]),i.useEffect(()=>()=>{for(const P of Object.values(T))P.dispose()},[T]);const F=i.useCallback(P=>{A.material=P,A.material.needsUpdate=!0},[A]);return{materials:T,setMeshMaterial:F,mesh:A}},Se=.016,Pe=Object.freeze({density_dissipation:.98,velocity_dissipation:.99,velocity_acceleration:10,pressure_dissipation:.9,pressure_iterations:20,curl_strength:35,splat_radius:.002,fluid_color:new o.Vector3(1,1,1),pointerValues:!1}),Sn=({size:e,dpr:n,samples:t,isSizeUpdate:r,customFluidProps:u})=>{const m=U(n),l=i.useMemo(()=>new o.Scene,[]),{materials:s,setMeshMaterial:v,mesh:g}=bn({scene:l,size:e,dpr:m.shader,customFluidProps:u}),d=k(e),y=ge(),M=i.useMemo(()=>({scene:l,camera:d,dpr:m.fbo,size:e,samples:t,isSizeUpdate:r}),[l,d,e,t,m.fbo,r]),[a,h]=re(M),[c,p]=re(M),[f,w]=j(M),[b,x]=j(M),[S,_]=re(M),T=i.useRef(new o.Vector2(0,0)),I=i.useRef(new o.Vector3(0,0,0)),[A,F]=$(Pe),P=i.useMemo(()=>({advection:R(s.advectionMaterial),splat:R(s.splatMaterial),curl:R(s.curlMaterial),vorticity:R(s.vorticityMaterial),divergence:R(s.divergenceMaterial),clear:R(s.clearMaterial),pressure:R(s.pressureMaterial),gradientSubtract:R(s.gradientSubtractMaterial)}),[s]),O=i.useMemo(()=>({advection:V(s.advectionMaterial),splat:V(s.splatMaterial),curl:V(s.curlMaterial),vorticity:V(s.vorticityMaterial),divergence:V(s.divergenceMaterial),clear:V(s.clearMaterial),pressure:V(s.pressureMaterial),gradientSubtract:V(s.gradientSubtractMaterial)}),[s]),q=i.useCallback((H,G)=>{F(H),G&&Object.keys(G).forEach(se=>{O[se](G[se])})},[F,O]);return[i.useCallback((H,G,se)=>{const{gl:K,pointer:we,size:Le}=H;q(G,se);const Te=h(K,({read:N})=>{v(s.advectionMaterial),P.advection("uVelocity",N),P.advection("uSource",N),P.advection("dissipation",A.velocity_dissipation)}),mr=p(K,({read:N})=>{v(s.advectionMaterial),P.advection("uVelocity",Te),P.advection("uSource",N),P.advection("dissipation",A.density_dissipation)}),ye=A.pointerValues||y(we);ye.isVelocityUpdate&&(h(K,({read:N})=>{v(s.splatMaterial),P.splat("uTarget",N),P.splat("point",ye.currentPointer);const ve=ye.diffPointer.multiply(T.current.set(Le.width,Le.height).multiplyScalar(A.velocity_acceleration));P.splat("color",I.current.set(ve.x,ve.y,1)),P.splat("radius",A.splat_radius)}),p(K,({read:N})=>{v(s.splatMaterial),P.splat("uTarget",N);const ve=typeof A.fluid_color=="function"?A.fluid_color(ye.velocity):A.fluid_color;P.splat("color",ve)}));const pr=w(K,()=>{v(s.curlMaterial),P.curl("uVelocity",Te)});h(K,({read:N})=>{v(s.vorticityMaterial),P.vorticity("uVelocity",N),P.vorticity("uCurl",pr),P.vorticity("curl",A.curl_strength)});const fr=x(K,()=>{v(s.divergenceMaterial),P.divergence("uVelocity",Te)});_(K,({read:N})=>{v(s.clearMaterial),P.clear("uTexture",N),P.clear("value",A.pressure_dissipation)}),v(s.pressureMaterial),P.pressure("uDivergence",fr);let ke;for(let N=0;N{P.pressure("uPressure",ve)});return h(K,({read:N})=>{v(s.gradientSubtractMaterial),P.gradientSubtract("uPressure",ke),P.gradientSubtract("uVelocity",N)}),mr},[s,P,v,w,p,x,y,_,h,A,q]),q,{scene:l,mesh:g,materials:s,camera:d,renderTarget:{velocity:a,density:c,curl:f,divergence:b,pressure:S},output:c.read.texture}]};var Cn=`varying vec2 vUv; + +void main() { + vUv = uv; + gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); +}`,_n=`precision highp float; + +uniform sampler2D uMap; +uniform float uOpacity; + +varying vec2 vUv; + +void main() { + vec2 uv = vUv; + vec3 color = texture2D(uMap, uv).rgb; + gl_FragColor = vec4(color,uOpacity); +}`;const wn=({scale:e,max:n,texture:t,scene:r,uniforms:u,onBeforeCompile:m})=>{const l=i.useMemo(()=>new o.PlaneGeometry(e,e),[e]),s=i.useMemo(()=>new o.ShaderMaterial({uniforms:{uOpacity:{value:0},uMap:{value:t||D},...u},blending:o.AdditiveBlending,vertexShader:Cn,fragmentShader:_n,...z,transparent:!0}),[t,u]),v=i.useMemo(()=>{const g=[];for(let d=0;d()=>{v.forEach(g=>{g.geometry.dispose(),Array.isArray(g.material)?g.material.forEach(d=>d.dispose()):g.material.dispose(),r.remove(g)})},[r,v]),v},Re=Object.freeze({frequency:.01,rotation:.05,fadeout_speed:.9,scale:.3,alpha:.6,pointerValues:!1}),Tn=({texture:e,scale:n=64,max:t=100,size:r,dpr:u,samples:m,isSizeUpdate:l,uniforms:s,onBeforeCompile:v})=>{const g=U(u),d=i.useMemo(()=>new o.Scene,[]),y=wn({scale:n,max:t,texture:e,scene:d,uniforms:s,onBeforeCompile:v}),M=k(r),a=ge(),[h,c]=j({scene:d,camera:M,size:r,dpr:g.fbo,samples:m,isSizeUpdate:l}),[p,f]=$(Re),w=i.useRef(0),b=i.useMemo(()=>(S,_)=>{f(S),y.forEach(T=>{if(T.visible){const I=T.material;T.rotation.z+=p.rotation,T.scale.x=p.fadeout_speed*T.scale.x+p.scale,T.scale.y=T.scale.x;const A=I.uniforms.uOpacity.value;R(I)("uOpacity",A*p.fadeout_speed),A<.001&&(T.visible=!1)}V(T.material)(_)})},[y,p,f]);return[i.useCallback((S,_,T)=>{const{gl:I,pointer:A,size:F}=S;b(_,T);const P=p.pointerValues||a(A);if(p.frequency{const r=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),u=i.useMemo(()=>{const l=new o.ShaderMaterial({uniforms:{uTime:{value:0},scale:{value:ne.scale},timeStrength:{value:ne.timeStrength},noiseOctaves:{value:ne.noiseOctaves},fbmOctaves:{value:ne.fbmOctaves},warpOctaves:{value:ne.warpOctaves},warpDirection:{value:ne.warpDirection},warpStrength:{value:ne.warpStrength},...n},vertexShader:Dn,fragmentShader:Pn,...z});return l.onBeforeCompile=B(t),l},[t,n]),m=L(e,r,u,o.Mesh);return{material:u,mesh:m}},ne=Object.freeze({scale:.004,timeStrength:.3,noiseOctaves:2,fbmOctaves:2,warpOctaves:2,warpDirection:new o.Vector2(2,2),warpStrength:8,beat:!1}),An=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=Rn({scene:s,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[a,h]=$(ne),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{const{gl:_,clock:T}=b;return f(x,S),c("scale",a.scale),c("timeStrength",a.timeStrength),c("noiseOctaves",a.noiseOctaves),c("fbmOctaves",a.fbmOctaves),c("warpOctaves",a.warpOctaves),c("warpDirection",a.warpDirection),c("warpStrength",a.warpStrength),c("uTime",a.beat||T.getElapsedTime()),M(_)},[M,c,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var In="#usf ",Fn=`precision highp float; +varying vec2 vUv; + +uniform sampler2D uTexture; +uniform bool isTexture; +uniform sampler2D noise; +uniform bool isNoise; +uniform vec2 noiseStrength; +uniform float laminateLayer; +uniform vec2 laminateInterval; +uniform vec2 laminateDetail; +uniform vec2 distortion; +uniform vec3 colorFactor; +uniform float uTime; +uniform vec2 timeStrength; +uniform float scale; + +void main() { + vec2 uv = vUv; + + vec2 pos = isTexture ? texture2D(uTexture, uv).rg : uv * scale; + vec2 noise = isNoise ? texture2D(noise, uv).rg : vec2(0.0); + float alpha = isTexture ? texture2D(uTexture, uv).a : 1.0; + + + alpha = (alpha < 1e-10) ? 0.0 : alpha; + + vec3 col; + for(float j = 0.0; j < 3.0; j++){ + for(float i = 1.0; i < laminateLayer; i++){ + float timeNoiseSin = sin(uTime / (i + j)) * timeStrength.x + noise.r * noiseStrength.x; + float timeNoiseCos = cos(uTime / (i + j)) * timeStrength.y + noise.g * noiseStrength.y; + pos.x += laminateInterval.x / (i + j) * cos(i * distortion.x * pos.y + timeNoiseSin + sin(i + j)); + pos.y += laminateInterval.y / (i + j) * cos(i * distortion.y * pos.x + timeNoiseCos + sin(i + j)); + } + col[int(j)] = sin(pow(pos.x, 2.) * pow(laminateDetail.x, 2.)) + sin(pow(pos.y, 2.) * pow(laminateDetail.y, 2.)); + } + + col *= colorFactor * alpha; + col = clamp(col, 0.0, 1.0); + + gl_FragColor = vec4(col, alpha); +}`;const Vn=({scene:e,uniforms:n,onBeforeCompile:t})=>{const r=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),u=i.useMemo(()=>{const l=new o.ShaderMaterial({uniforms:{uTexture:{value:D},isTexture:{value:!1},scale:{value:Y.scale},noise:{value:D},noiseStrength:{value:Y.noiseStrength},isNoise:{value:!1},laminateLayer:{value:Y.laminateLayer},laminateInterval:{value:Y.laminateInterval},laminateDetail:{value:Y.laminateDetail},distortion:{value:Y.distortion},colorFactor:{value:Y.colorFactor},uTime:{value:0},timeStrength:{value:Y.timeStrength},...n},vertexShader:In,fragmentShader:Fn,...z});return l.onBeforeCompile=B(t),l},[t,n]),m=L(e,r,u,o.Mesh);return{material:u,mesh:m}},Y=Object.freeze({texture:!1,scale:1,laminateLayer:1,laminateInterval:new o.Vector2(.1,.1),laminateDetail:new o.Vector2(1,1),distortion:new o.Vector2(0,0),colorFactor:new o.Vector3(1,1,1),timeStrength:new o.Vector2(0,0),noise:!1,noiseStrength:new o.Vector2(0,0),beat:!1}),Bn=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=Vn({scene:s,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[a,h]=$(Y),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{const{gl:_,clock:T}=b;return f(x,S),a.texture?(c("uTexture",a.texture),c("isTexture",!0)):(c("isTexture",!1),c("scale",a.scale)),a.noise?(c("noise",a.noise),c("isNoise",!0),c("noiseStrength",a.noiseStrength)):c("isNoise",!1),c("uTime",a.beat||T.getElapsedTime()),c("laminateLayer",a.laminateLayer),c("laminateInterval",a.laminateInterval),c("laminateDetail",a.laminateDetail),c("distortion",a.distortion),c("colorFactor",a.colorFactor),c("timeStrength",a.timeStrength),M(_)},[M,c,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var zn="#usf ",On=`precision highp float; + +varying vec2 vUv; +uniform float u_time; +uniform float u_pattern; +uniform float u_complexity; +uniform float u_complexityAttenuation; +uniform float u_iterations; +uniform float u_timeStrength; +uniform float u_scale; + +vec3 marble(vec3 p){ + vec4 n; + for(float i;i{const r=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),u=i.useMemo(()=>{const l=new o.ShaderMaterial({uniforms:{u_time:{value:0},u_pattern:{value:oe.pattern},u_complexity:{value:oe.complexity},u_complexityAttenuation:{value:oe.complexityAttenuation},u_iterations:{value:oe.iterations},u_timeStrength:{value:oe.timeStrength},u_scale:{value:oe.scale},...n},vertexShader:zn,fragmentShader:On,...z});return l.onBeforeCompile=B(t),l},[t,n]),m=L(e,r,u,o.Mesh);return{material:u,mesh:m}},oe=Object.freeze({pattern:0,complexity:2,complexityAttenuation:.2,iterations:8,timeStrength:.2,scale:.002,beat:!1}),En=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=Un({scene:s,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[a,h]=$(oe),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{const{gl:_,clock:T}=b;return f(x,S),c("u_pattern",a.pattern),c("u_complexity",a.complexity),c("u_complexityAttenuation",a.complexityAttenuation),c("u_iterations",a.iterations),c("u_timeStrength",a.timeStrength),c("u_scale",a.scale),c("u_time",a.beat||T.getElapsedTime()),M(_)},[M,c,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var Ln="#usf ",kn=`precision highp float; +precision highp int; + +varying vec2 vUv; +uniform sampler2D uTexture; +uniform vec3 uColor1; +uniform vec3 uColor2; +uniform vec3 uColor3; +uniform vec3 uColor4; +uniform vec3 uRgbWeight; + +vec3 cosPalette( float t, vec3 color1, vec3 color2, vec3 color3, vec3 color4 ){ + return color1 + color2 * cos( 6.28318 * ( color3 * t + color4) ); +} + +void main() { + + vec4 tex = texture2D(uTexture, vUv); + float gray = dot(tex.rgb, uRgbWeight); + + vec3 outColor = cosPalette( + gray, + uColor1, + uColor2, + uColor3, + uColor4 + ); + + gl_FragColor = vec4(outColor, tex.a); +}`;const $n=({scene:e,uniforms:n,onBeforeCompile:t})=>{const r=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),u=i.useMemo(()=>{const l=new o.ShaderMaterial({uniforms:{uTexture:{value:D},uRgbWeight:{value:ie.rgbWeight},uColor1:{value:ie.color1},uColor2:{value:ie.color2},uColor3:{value:ie.color3},uColor4:{value:ie.color4},...n},vertexShader:Ln,fragmentShader:kn,...z});return l.onBeforeCompile=B(t),l},[t,n]),m=L(e,r,u,o.Mesh);return{material:u,mesh:m}},ie=Object.freeze({texture:D,color1:new o.Color().set(.5,.5,.5),color2:new o.Color().set(.5,.5,.5),color3:new o.Color().set(1,1,1),color4:new o.Color().set(0,.1,.2),rgbWeight:new o.Vector3(.299,.587,.114)}),jn=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=$n({scene:s,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[a,h]=$(ie),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{const{gl:_}=b;return f(x,S),c("uTexture",a.texture),c("uColor1",a.color1),c("uColor2",a.color2),c("uColor3",a.color3),c("uColor4",a.color4),c("uRgbWeight",a.rgbWeight),M(_)},[M,c,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var Wn="#usf ",qn=`precision highp float; + +varying vec2 vUv; +uniform sampler2D uTexture; + +uniform vec3 uColor0; +uniform vec3 uColor1; + +void main() { + vec2 uv = vUv; + vec4 texColor = texture2D(uTexture, uv); + 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 Nn=({scene:e,uniforms:n,onBeforeCompile:t})=>{const r=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),u=i.useMemo(()=>{const l=new o.ShaderMaterial({uniforms:{uTexture:{value:D},uColor0:{value:xe.color0},uColor1:{value:xe.color1},...n},vertexShader:Wn,fragmentShader:qn,...z});return l.onBeforeCompile=B(t),l},[t,n]),m=L(e,r,u,o.Mesh);return{material:u,mesh:m}},xe=Object.freeze({texture:D,color0:new o.Color(16777215),color1:new o.Color(0)}),Gn=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=Nn({scene:s,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[a,h]=$(xe),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{const{gl:_}=b;return f(x,S),c("uTexture",a.texture),c("uColor0",a.color0),c("uColor1",a.color1),M(_)},[M,c,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var Kn="#usf ",Xn=`precision highp float; + +varying vec2 vUv; +uniform sampler2D u_texture; +uniform sampler2D uMap; +uniform bool u_isAlphaMap; +uniform sampler2D u_alphaMap; +uniform float uMapIntensity; +uniform vec3 u_brightness; +uniform float u_min; +uniform float u_max; +uniform vec3 u_dodgeColor; +uniform bool u_isDodgeColor; + +void main() { + vec2 uv = vUv; + + #usf + + + float brightness = dot(mapColor,u_brightness); + vec4 textureMap = texture2D(u_texture, uv); + float blendValue = smoothstep(u_min, u_max, brightness); + + + vec3 dodgeColor = u_isDodgeColor ? u_dodgeColor : mapColor; + vec3 outputColor = blendValue * dodgeColor + (1.0 - blendValue) * textureMap.rgb; + + + float alpha = u_isAlphaMap ? texture2D(u_alphaMap, uv).a : textureMap.a; + float mixValue = u_isAlphaMap ? alpha : 0.0; + vec3 alphaColor = vec3(mix(outputColor,mapColor,mixValue)); + + gl_FragColor = vec4(alphaColor,alpha); +}`;const Hn=({scene:e,uniforms:n,onBeforeCompile:t})=>{const r=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),u=i.useMemo(()=>{const l=new o.ShaderMaterial({uniforms:{u_texture:{value:D},uMap:{value:D},u_alphaMap:{value:D},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 o.Color},u_isDodgeColor:{value:!1},...n},vertexShader:Kn,fragmentShader:Xn,...z});return l.onBeforeCompile=B(t),l},[t,n]),m=L(e,r,u,o.Mesh);return{material:u,mesh:m}},le=Object.freeze({texture:D,map:D,alphaMap:!1,mapIntensity:.3,brightness:new o.Vector3(.5,.5,.5),min:0,max:1,dodgeColor:!1}),Yn=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=Hn({scene:s,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[a,h]=$(le),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{const{gl:_}=b;return f(x,S),c("u_texture",a.texture),c("uMap",a.map),c("uMapIntensity",a.mapIntensity),a.alphaMap?(c("u_alphaMap",a.alphaMap),c("u_isAlphaMap",!0)):c("u_isAlphaMap",!1),c("u_brightness",a.brightness),c("u_min",a.min),c("u_max",a.max),a.dodgeColor?(c("u_dodgeColor",a.dodgeColor),c("u_isDodgeColor",!0)):c("u_isDodgeColor",!1),M(_)},[M,c,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var Qn="#usf ",Zn=`precision highp float; + +varying vec2 vUv; +uniform vec2 uResolution; +uniform vec2 uTextureResolution; +uniform sampler2D uTexture0; +uniform sampler2D uTexture1; +uniform sampler2D uMap; +uniform float mapIntensity; +uniform float edgeIntensity; +uniform float progress; +uniform float dirX; +uniform float dirY; +uniform vec2 epicenter; +uniform float padding; + +bool isInPaddingArea(vec2 uv) { + return uv.x < padding || uv.x > 1.0 - padding || uv.y < padding || uv.y > 1.0 - padding; +} + +void main() { + #usf + + + vec2 map = texture2D(uMap, uv).rg; + vec2 normalizedMap = map * 2.0 - 1.0; + + + uv = uv * 2.0 - 1.0; + uv *= map * distance(epicenter, uv) * edgeIntensity + 1.0; + uv = (uv + 1.0) / 2.0; + + + if (isInPaddingArea(uv)) { + gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0); + return; + } + vec2 paddedUV = uv * (1.0 - 2.0 * padding * -1.) + padding * -1.; + + + vec2 centeredUV = paddedUV - vec2(0.5); + + + centeredUV *= normalizedMap * map * mapIntensity + 1.0; + + + float xOffsetTexture0 = 0.5 - dirX * progress; + float yOffsetTexture0 = 0.5 - dirY * progress; + vec2 samplePosTexture0 = vec2(xOffsetTexture0, yOffsetTexture0) + centeredUV; + + + float xOffsetTexture1 = 0.5 + dirX * (1.0 - progress); + float yOffsetTexture1 = 0.5 + dirY * (1.0 - progress); + vec2 samplePosTexture1 = vec2(xOffsetTexture1, yOffsetTexture1) + centeredUV; + + vec4 color0 = texture2D(uTexture0, samplePosTexture0); + vec4 color1 = texture2D(uTexture1, samplePosTexture1); + + gl_FragColor = mix(color0, color1, progress); + +}`;const Jn=({scene:e,size:n,dpr:t,uniforms:r,onBeforeCompile:u})=>{const m=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),l=i.useMemo(()=>{var d,y;const g=new o.ShaderMaterial({uniforms:{uResolution:{value:new o.Vector2},uTextureResolution:{value:new o.Vector2},uTexture0:{value:D},uTexture1:{value:D},padding:{value:te.padding},uMap:{value:D},edgeIntensity:{value:te.edgeIntensity},mapIntensity:{value:te.mapIntensity},epicenter:{value:te.epicenter},progress:{value:te.progress},dirX:{value:(d=te.dir)==null?void 0:d.x},dirY:{value:(y=te.dir)==null?void 0:y.y},...r},vertexShader:Qn,fragmentShader:Zn,...z});return g.onBeforeCompile=B(u),g},[u,r]),s=X(n,t);R(l)("uResolution",s.clone());const v=L(e,m,l,o.Mesh);return{material:l,mesh:v}},te=Object.freeze({texture0:D,texture1:D,padding:0,map:D,mapIntensity:0,edgeIntensity:0,epicenter:new o.Vector2(0,0),progress:0,dir:new o.Vector2(0,0)}),et=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=Jn({scene:s,size:e,dpr:l.shader,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,dpr:l.fbo,size:e,samples:t,isSizeUpdate:r}),[a,h]=$(te),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{var F,P,O,q,ae,H,G,se;const{gl:_}=b;f(x,S),c("uTexture0",a.texture0),c("uTexture1",a.texture1),c("progress",a.progress);const T=[((P=(F=a.texture0)==null?void 0:F.image)==null?void 0:P.width)||0,((q=(O=a.texture0)==null?void 0:O.image)==null?void 0:q.height)||0],I=[((H=(ae=a.texture1)==null?void 0:ae.image)==null?void 0:H.width)||0,((se=(G=a.texture1)==null?void 0:G.image)==null?void 0:se.height)||0],A=T.map((K,we)=>K+(I[we]-K)*a.progress);return c("uTextureResolution",A),c("padding",a.padding),c("uMap",a.map),c("mapIntensity",a.mapIntensity),c("edgeIntensity",a.edgeIntensity),c("epicenter",a.epicenter),c("dirX",a.dir.x),c("dirY",a.dir.y),M(_)},[M,c,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var nt="#usf ",tt=`precision highp float; + +varying vec2 vUv; +uniform sampler2D u_texture; +uniform vec3 u_brightness; +uniform float u_min; +uniform float u_max; + +void main() { + vec2 uv = vUv; + vec3 color = texture2D(u_texture, uv).rgb; + 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 rt=({scene:e,uniforms:n,onBeforeCompile:t})=>{const r=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),u=i.useMemo(()=>{const l=new o.ShaderMaterial({uniforms:{u_texture:{value:D},u_brightness:{value:pe.brightness},u_min:{value:pe.min},u_max:{value:pe.max},...n},vertexShader:nt,fragmentShader:tt,...z});return l.onBeforeCompile=B(t),l},[t,n]),m=L(e,r,u,o.Mesh);return{material:u,mesh:m}},pe=Object.freeze({texture:D,brightness:new o.Vector3(.5,.5,.5),min:0,max:1}),ot=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=rt({scene:s,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[a,h]=$(pe),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{const{gl:_}=b;return f(x,S),c("u_texture",a.texture),c("u_brightness",a.brightness),c("u_min",a.min),c("u_max",a.max),M(_)},[M,c,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var at="#usf ",ut=`precision highp float; + +varying vec2 vUv; +uniform sampler2D u_texture; +uniform sampler2D uMap; +uniform float uMapIntensity; + +void main() { + vec2 uv = vUv; + + #usf + + gl_FragColor = texture2D(u_texture, uv); +}`;const it=({scene:e,uniforms:n,onBeforeCompile:t})=>{const r=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),u=i.useMemo(()=>{const l=new o.ShaderMaterial({uniforms:{u_texture:{value:D},uMap:{value:D},uMapIntensity:{value:Ce.mapIntensity},...n},vertexShader:at,fragmentShader:ut,...z});return l.onBeforeCompile=B(t),l},[t,n]),m=L(e,r,u,o.Mesh);return{material:u,mesh:m}},Ce=Object.freeze({texture:D,map:D,mapIntensity:.3}),st=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=it({scene:s,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[a,h]=$(Ce),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{const{gl:_}=b;return f(x,S),c("u_texture",a.texture),c("uMap",a.map),c("uMapIntensity",a.mapIntensity),M(_)},[M,c,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var lt="#usf ",ct=`precision highp float; + +uniform sampler2D uTexture; +uniform sampler2D uMap; + +varying vec2 vUv; + +void main() { + vec2 uv = vUv; + vec4 tex = texture2D(uTexture, uv); + vec4 map = texture2D(uMap, uv); + gl_FragColor = mix(tex,map,map.a); +}`;const vt=({scene:e,uniforms:n,onBeforeCompile:t})=>{const r=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),u=i.useMemo(()=>{const l=new o.ShaderMaterial({uniforms:{uTexture:{value:D},uMap:{value:D},...n},vertexShader:lt,fragmentShader:ct,...z});return l.onBeforeCompile=B(t),l},[t,n]),m=L(e,r,u,o.Mesh);return{material:u,mesh:m}},Ae=Object.freeze({texture:D,map:D}),mt=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=vt({scene:s,size:e,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[a,h]=$(Ae),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{const{gl:_}=b;return f(x,S),c("uTexture",a.texture),c("uMap",a.map),M(_)},[c,M,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var pt="#usf ",ft=`precision highp float; + +varying vec2 vUv; +uniform sampler2D u_texture; +uniform float u_brightness; +uniform float u_saturation; + +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)); + vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); + + 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); +} + +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); +} + +void main() { + vec4 tex = texture2D(u_texture, vUv); + vec3 hsv = rgb2hsv(tex.rgb); + hsv.y *= u_saturation; + hsv.z *= u_brightness; + vec3 final = hsv2rgb(hsv); + gl_FragColor = vec4(final, tex.a); +}`;const dt=({scene:e,uniforms:n,onBeforeCompile:t})=>{const r=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),u=i.useMemo(()=>{const l=new o.ShaderMaterial({uniforms:{u_texture:{value:D},u_brightness:{value:Me.brightness},u_saturation:{value:Me.saturation},...n},vertexShader:pt,fragmentShader:ft,...z});return l.onBeforeCompile=B(t),l},[t,n]),m=L(e,r,u,o.Mesh);return{material:u,mesh:m}},Me=Object.freeze({texture:D,brightness:1,saturation:1}),gt=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=dt({scene:s,size:e,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[a,h]=$(Me),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{const{gl:_}=b;return f(x,S),c("u_texture",a.texture),c("u_brightness",a.brightness),c("u_saturation",a.saturation),M(_)},[c,M,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var ht="#usf ",xt=`precision highp float; + +varying vec2 vUv; +uniform vec2 uResolution; +uniform vec2 uTextureResolution; +uniform sampler2D uTexture; + +void main() { + #usf + + gl_FragColor = texture2D(uTexture, uv); +}`;const Mt=({scene:e,size:n,dpr:t,uniforms:r,onBeforeCompile:u})=>{const m=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),l=i.useMemo(()=>{const g=new o.ShaderMaterial({uniforms:{uResolution:{value:new o.Vector2},uTextureResolution:{value:new o.Vector2},uTexture:{value:D},...r},vertexShader:ht,fragmentShader:xt,...z});return g.onBeforeCompile=B(u),g},[u,r]),s=X(n,t);R(l)("uResolution",s.clone());const v=L(e,m,l,o.Mesh);return{material:l,mesh:v}},Ie=Object.freeze({texture:D}),yt=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=Mt({scene:s,size:e,dpr:l.shader,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,dpr:l.fbo,size:e,samples:t,isSizeUpdate:r}),[a,h]=$(Ie),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{var T,I,A,F,P,O;const{gl:_}=b;return f(x,S),c("uTexture",a.texture),c("uTextureResolution",[((A=(I=(T=a.texture)==null?void 0:T.source)==null?void 0:I.data)==null?void 0:A.width)||0,((O=(P=(F=a.texture)==null?void 0:F.source)==null?void 0:P.data)==null?void 0:O.height)||0]),M(_)},[M,c,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var bt="#usf ",St=`precision highp float; + +varying vec2 vUv; +uniform sampler2D uTexture; +uniform vec2 uResolution; +uniform float uBlurSize; + +void main() { + vec2 uv = vUv; + vec2 perDivSize = uBlurSize / uResolution; + + + vec4 outColor = vec4( + texture2D(uTexture, uv + perDivSize * vec2(-1.0, -1.0)) + + texture2D(uTexture, uv + perDivSize * vec2(0.0, -1.0)) + + texture2D(uTexture, uv + perDivSize * vec2(1.0, -1.0)) + + texture2D(uTexture, uv + perDivSize * vec2(-1.0, 0.0)) + + texture2D(uTexture, uv + perDivSize * vec2(0.0, 0.0)) + + texture2D(uTexture, uv + perDivSize * vec2(1.0, 0.0)) + + texture2D(uTexture, uv + perDivSize * vec2(-1.0, 1.0)) + + texture2D(uTexture, uv + perDivSize * vec2(0.0, 1.0)) + + texture2D(uTexture, uv + perDivSize * vec2(1.0, 1.0)) + ) / 9.0; + + gl_FragColor = outColor; +}`;const Ct=({scene:e,uniforms:n,onBeforeCompile:t})=>{const r=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),u=i.useMemo(()=>{const l=new o.ShaderMaterial({uniforms:{uTexture:{value:D},uResolution:{value:new o.Vector2(0,0)},uBlurSize:{value:_e.blurSize},...n},vertexShader:bt,fragmentShader:St,...z});return l.onBeforeCompile=B(t),l},[t,n]),m=L(e,r,u,o.Mesh);return{material:u,mesh:m}},_e=Object.freeze({texture:D,blurSize:3,blurPower:5}),_t=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=Ct({scene:s,uniforms:u,onBeforeCompile:m}),d=k(e),y=i.useMemo(()=>({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[s,d,e,l.fbo,t,r]),[M,a]=re(y),[h,c]=$(_e),p=R(v),f=V(v),w=i.useCallback((x,S)=>{c(x),f(S)},[c,f]);return[i.useCallback((x,S,_)=>{var F,P,O,q,ae,H;const{gl:T}=x;w(S,_),p("uTexture",h.texture),p("uResolution",[((O=(P=(F=h.texture)==null?void 0:F.source)==null?void 0:P.data)==null?void 0:O.width)||0,((H=(ae=(q=h.texture)==null?void 0:q.source)==null?void 0:ae.data)==null?void 0:H.height)||0]),p("uBlurSize",h.blurSize);let I=a(T);const A=h.blurPower;for(let G=0;G{const r=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),u=i.useMemo(()=>{const l=new o.ShaderMaterial({uniforms:{uTexture:{value:D},uBackbuffer:{value:D},uBegin:{value:fe.begin},uEnd:{value:fe.end},uStrength:{value:fe.strength},...n},vertexShader:wt,fragmentShader:Tt,...z});return l.onBeforeCompile=B(t),l},[t,n]),m=L(e,r,u,o.Mesh);return{material:u,mesh:m}},fe=Object.freeze({texture:D,begin:new o.Vector2(0,0),end:new o.Vector2(0,0),strength:.9}),Pt=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=Dt({scene:s,uniforms:u,onBeforeCompile:m}),d=k(e),y=i.useMemo(()=>({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[s,d,e,l.fbo,t,r]),[M,a]=re(y),[h,c]=$(fe),p=R(v),f=V(v),w=i.useCallback((x,S)=>{c(x),f(S)},[c,f]);return[i.useCallback((x,S,_)=>{const{gl:T}=x;return w(S,_),p("uTexture",h.texture),p("uBegin",h.begin),p("uEnd",h.end),p("uStrength",h.strength),a(T,({read:I})=>{p("uBackbuffer",I)})},[a,p,w,h]),w,{scene:s,mesh:g,material:v,camera:d,renderTarget:M,output:M.read.texture}]};var Rt="#usf ",At=`precision highp float; + +varying vec2 vUv; +uniform float uProgress; +uniform float uStrength; +uniform float uWidth; +uniform vec2 uEpicenter; +uniform int uMode; + +float PI = 3.141592653589; + +void main() { + + vec2 uv = vUv; + + float progress = min(uProgress, 1.0); + float progressFactor = sin(progress * PI); + + float border = progress - progress * progressFactor * uWidth; + float blur = uStrength * progressFactor; + + + vec2 normalizeCenter = (uEpicenter + 1.0) / 2.0; + + + float dist = uMode == 0 ? length(uv - normalizeCenter) : uMode == 1 ? length(uv.x - normalizeCenter.x) : length(uv.y - normalizeCenter.y); + + + float maxDistance = max( + length(vec2(0.0, 0.0) - normalizeCenter), + max( + length(vec2(1.0, 0.0) - normalizeCenter), + max( + length(vec2(0.0, 1.0) - normalizeCenter), + length(vec2(1.0, 1.0) - normalizeCenter) + ) + ) + ); + + + dist = maxDistance > 0.0 ? dist / maxDistance : dist; + + vec3 color = vec3(smoothstep(border - blur, border, dist) - + smoothstep(progress, progress + blur, dist)); + + + color *= progressFactor; + + gl_FragColor = vec4(color, 1.0); +}`;const It=({scene:e,uniforms:n,onBeforeCompile:t})=>{const r=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),u=i.useMemo(()=>{const l=new o.ShaderMaterial({uniforms:{uEpicenter:{value:ce.epicenter},uProgress:{value:ce.progress},uStrength:{value:ce.strength},uWidth:{value:ce.width},uMode:{value:0},...n},vertexShader:Rt,fragmentShader:At,...z});return l.onBeforeCompile=B(t),l},[t,n]),m=L(e,r,u,o.Mesh);return{material:u,mesh:m}},ce=Object.freeze({epicenter:new o.Vector2(0,0),progress:0,width:0,strength:0,mode:"center"}),Ft=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=It({scene:s,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[a,h]=$(ce),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{const{gl:_}=b;return f(x,S),c("uEpicenter",a.epicenter),c("uProgress",a.progress),c("uWidth",a.width),c("uStrength",a.strength),c("uMode",a.mode==="center"?0:a.mode==="horizontal"?1:2),M(_)},[M,c,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var Vt="#usf ",Bt=`precision highp float; +varying vec2 vUv; + +uniform sampler2D u_texture; +uniform vec2 u_resolution; +uniform vec3 u_keyColor; +uniform float u_similarity; +uniform float u_smoothness; +uniform float u_spill; + +uniform vec4 u_color; +uniform float u_contrast; +uniform float u_brightness; +uniform float u_gamma; + +vec2 RGBtoUV(vec3 rgb) { + return vec2( + rgb.r * -0.169 + rgb.g * -0.331 + rgb.b * 0.5 + 0.5, + rgb.r * 0.5 + rgb.g * -0.419 + rgb.b * -0.081 + 0.5 + ); +} +float getChromeDist(vec3 texColor){ + float chromaDist = distance(RGBtoUV(texColor), RGBtoUV(u_keyColor)); + return chromaDist; +} + +float getBoxFilteredChromaDist(vec3 rgb, vec2 uv) +{ + vec2 pixel_size = vec2(1.) / u_resolution; + vec2 h_pixel_size = pixel_size / 2.0; + vec2 point_0 = vec2(pixel_size.x, h_pixel_size.y); + vec2 point_1 = vec2(h_pixel_size.x, -pixel_size.y); + float distVal = getChromeDist(texture2D(u_texture,uv-point_0).rgb); + distVal += getChromeDist(texture2D(u_texture,uv+point_0).rgb); + distVal += getChromeDist(texture2D(u_texture,uv-point_1).rgb); + distVal += getChromeDist(texture2D(u_texture,uv+point_1).rgb); + distVal *= 2.0; + distVal += getChromeDist(rgb); + return distVal / 9.0; +} + +vec4 CalcColor(vec4 rgba) +{ + return vec4(pow(rgba.rgb, vec3(u_gamma, u_gamma, u_gamma)) * u_contrast + u_brightness, rgba.a); +} + +void main() { + + vec2 uv = vUv; + + vec4 texColor = texture2D(u_texture, uv); + texColor.rgb *= (texColor.a > 0.) ? (1. / texColor.a) : 0.; + + float chromaDist = getBoxFilteredChromaDist(texColor.rgb,uv); + + float baseMask = chromaDist - u_similarity; + float fullMask = pow(clamp(baseMask / u_smoothness, 0., 1.), 1.5); + + texColor.rgba *= u_color; + texColor.a = fullMask; + + float spillVal = pow(clamp(baseMask / u_spill, 0., 1.), 1.5); + float desat = clamp(texColor.r * 0.2126 + texColor.g * 0.7152 + texColor.b * 0.0722, 0., 1.); + texColor.rgb = mix(vec3(desat, desat, desat), texColor.rgb, spillVal); + + vec4 finColor = CalcColor(texColor); + + gl_FragColor = finColor; +}`;const zt=({scene:e,size:n,dpr:t,uniforms:r,onBeforeCompile:u})=>{const m=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),l=i.useMemo(()=>{const g=new o.ShaderMaterial({uniforms:{u_texture:{value:D},u_resolution:{value:new o.Vector2},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},...r},vertexShader:Vt,fragmentShader:Bt,...z});return g.onBeforeCompile=B(u),g},[u,r]),s=X(n,t);R(l)("u_resolution",s.clone());const v=L(e,m,l,o.Mesh);return{material:l,mesh:v}},Q=Object.freeze({texture:D,keyColor:new o.Color(65280),similarity:.2,smoothness:.1,spill:.2,color:new o.Vector4(1,1,1,1),contrast:1,brightness:0,gamma:1}),Ot=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=zt({scene:s,size:e,dpr:l.shader,uniforms:u,onBeforeCompile:m}),d=k(e),[y,M]=j({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[a,h]=$(Q),c=R(v),p=V(v),f=i.useCallback((b,x)=>{h(b),p(x)},[h,p]);return[i.useCallback((b,x,S)=>{const{gl:_}=b;return f(x,S),c("u_texture",a.texture),c("u_keyColor",a.keyColor),c("u_similarity",a.similarity),c("u_smoothness",a.smoothness),c("u_spill",a.spill),c("u_color",a.color),c("u_contrast",a.contrast),c("u_brightness",a.brightness),c("u_gamma",a.gamma),M(_)},[M,c,a,f]),f,{scene:s,mesh:g,material:v,camera:d,renderTarget:y,output:y.texture}]};var Ut=`precision highp float; + +varying vec2 vUv; +#usf + +#usf + +void main() { + vec4 usf_Position = vec4(position,1.); + vUv = uv; + + #usf
+ + gl_Position = usf_Position; +}`,Et=`precision highp float; + +varying vec2 vUv; +#usf + +uniform sampler2D uTexture; +uniform sampler2D uBackbuffer; +uniform float uTime; +uniform vec2 uPointer; +uniform vec2 uResolution; + +#usf + +void main() { + vec4 usf_FragColor = vec4(1.); + + #usf
+ + gl_FragColor = usf_FragColor; +}`;const Lt=({scene:e,size:n,dpr:t,uniforms:r,onBeforeCompile:u})=>{const m=i.useMemo(()=>new o.PlaneGeometry(2,2),[]),l=i.useMemo(()=>{const g=new o.ShaderMaterial({uniforms:{uTexture:{value:D},uBackbuffer:{value:D},uTime:{value:0},uPointer:{value:new o.Vector2},uResolution:{value:new o.Vector2},...r},vertexShader:Ut,fragmentShader:Et,...z});return g.onBeforeCompile=B(u),g},[u,r]),s=X(n,t);R(l)("uResolution",s.clone());const v=L(e,m,l,o.Mesh);return{material:l,mesh:v}},Fe=Object.freeze({texture:D,beat:!1}),kt=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m})=>{const l=U(n),s=i.useMemo(()=>new o.Scene,[]),{material:v,mesh:g}=Lt({scene:s,size:e,dpr:l.shader,uniforms:u,onBeforeCompile:m}),d=k(e),y=i.useMemo(()=>({scene:s,camera:d,size:e,dpr:l.fbo,samples:t,isSizeUpdate:r}),[s,d,e,l.fbo,t,r]),[M,a]=re(y),[h,c]=$(Fe),p=R(v),f=V(v),w=i.useCallback((x,S)=>{c(x),f(S)},[c,f]);return[i.useCallback((x,S,_)=>{const{gl:T,clock:I,pointer:A}=x;return w(S,_),p("uPointer",A),p("uTexture",h.texture),p("uTime",h.beat||I.getElapsedTime()),a(T,({read:F})=>{p("uBackbuffer",F)})},[a,p,h,w]),w,{scene:s,mesh:g,material:v,camera:d,renderTarget:M,output:M.read.texture}]},$t=({scene:e,geometry:n,material:t})=>{const r=L(e,n,t,o.Points),u=L(e,i.useMemo(()=>n.clone(),[n]),i.useMemo(()=>t.clone(),[t]),o.Mesh);return u.visible=!1,{points:r,interactiveMesh:u}};var jt=`uniform vec2 uResolution; +uniform float uMorphProgress; +uniform float uPointSize; + +uniform sampler2D uPicture; +uniform bool uIsPicture; +uniform sampler2D uAlphaPicture; +uniform bool uIsAlphaPicture; + +uniform vec3 uColor0; +uniform vec3 uColor1; +uniform vec3 uColor2; +uniform vec3 uColor3; + +uniform float uTime; + +uniform float uWobblePositionFrequency; +uniform float uWobbleTimeFrequency; +uniform float uWobbleStrength; +uniform float uWarpPositionFrequency; +uniform float uWarpTimeFrequency; +uniform float uWarpStrength; + +uniform sampler2D uDisplacement; +uniform bool uIsDisplacement; +uniform float uDisplacementIntensity; + +uniform float uSizeRandomIntensity; +uniform float uSizeRandomTimeFrequency; +uniform float uSizeRandomMin; +uniform float uSizeRandomMax; + +uniform float uMapArrayLength; + +uniform float uDivergence; +uniform vec3 uDivergencePoint; + +varying vec3 vColor; +varying float vPictureAlpha; +varying vec3 vDisplacementColor; +varying float vDisplacementIntensity; +varying float vMapArrayIndex; + +#usf + +#usf + +#usf + +float random3D(vec3 co) { + return fract(sin(dot(co.xyz ,vec3(12.9898, 78.233, 45.764))) * 43758.5453); +} + +void main() { + vec3 newPosition = position; + vec2 newUv = uv; + + #usf + #usf + + + vec3 displacement = uIsDisplacement ? texture2D(uDisplacement, newUv).rgb : vec3(0.0); + float displacementIntensity = smoothstep(0., 1., displacement.g); + vDisplacementColor = displacement; + vDisplacementIntensity = displacementIntensity; + + + displacement = displacement * 2.-1.; + displacement *= displacementIntensity * uDisplacementIntensity; + newPosition += displacement; + + + vec3 divergenceDir = newPosition - uDivergencePoint; + if (uDivergence > 0.0) { + newPosition += normalize(divergenceDir) * uDivergence; + } else if (uDivergence < 0.0) { + newPosition -= normalize(divergenceDir) * abs(uDivergence); + } + + + vec4 modelPosition = modelMatrix * vec4(newPosition, 1.0); + vec4 viewPosition = viewMatrix * modelPosition; + vec4 projectedPosition = projectionMatrix * viewPosition; + + + float wobble = uWobbleStrength > 0. ? getWobble(projectedPosition.xyz) : 0.0; + + gl_Position = projectedPosition += wobble; + + + vColor = uIsPicture ? texture2D(uPicture, newUv).rgb : mix(mix(uColor0, uColor1, newPosition.x), mix(uColor2, uColor3, newPosition.y), newPosition.z); + + + vPictureAlpha = uIsAlphaPicture ? texture2D(uAlphaPicture, newUv).g : 1.; + + + + float sizeRand = uSizeRandomIntensity > 0. ? mix(uSizeRandomMin,uSizeRandomMax,(simplexNoise4d(vec4(newPosition,uTime * uSizeRandomTimeFrequency))*.5+.5)) * uSizeRandomIntensity : 1.; + gl_PointSize = uPointSize * vPictureAlpha * uResolution.y * sizeRand; + gl_PointSize *= (1.0 / - viewPosition.z); + + + vMapArrayIndex = uMapArrayLength > 0. ? floor(random3D(position) * uMapArrayLength) : 0.; +}`,Wt=`precision highp float; +precision highp int; + +varying vec3 vColor; +varying float vPictureAlpha; +varying vec3 vDisplacementColor; +varying float vDisplacementIntensity; +varying float vMapArrayIndex; + +uniform float uBlurAlpha; +uniform float uBlurRadius; +uniform sampler2D uMap; +uniform bool uIsMap; +uniform sampler2D uAlphaMap; +uniform bool uIsAlphaMap; +uniform float uDisplacementColorIntensity; +uniform float uPointAlpha; + +#usf + +void main() { + vec2 uv = gl_PointCoord; + uv.y = 1.0 - uv.y; + + + float distanceToCenter = length(uv - .5); + float alpha = clamp(uBlurRadius / distanceToCenter - (1.-uBlurAlpha) , 0. , 1.); + + + vec4 mapArrayColor; + #usf + vec4 mapColor = isMapArray ? mapArrayColor : uIsMap ? texture2D(uMap,uv) : vec4(1.); + vec3 finalColor = isMapArray || uIsMap ? mapColor.rgb : vColor; + + + float mixIntensity = clamp(uDisplacementColorIntensity * vDisplacementIntensity,0.,1.); + finalColor = vDisplacementIntensity > 0. ? mix(finalColor,vDisplacementColor,mixIntensity) : finalColor; + + + float alphaMap = uIsAlphaMap ? texture2D(uAlphaMap,uv).g : 1.; + + gl_FragColor = vec4(finalColor,alpha * vPictureAlpha * alphaMap * mapColor.a * uPointAlpha); +}`;const Ve=(e,n,t,r,u)=>{var d;const m=t==="position"?"positionTarget":"uvTarget",l=t==="position"?"#usf ":"#usf ",s=t==="position"?"#usf ":"#usf ",v=t==="position"?"positionsList":"uvsList",g=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 o.BufferAttribute(e[0],u));let y="",M="";e.forEach((a,h)=>{n.setAttribute(`${m}${h}`,new o.BufferAttribute(a,u)),y+=`attribute vec${u} ${m}${h}; +`,h===0?M+=`${m}${h}`:M+=`,${m}${h}`}),r=r.replace(`${l}`,y),r=r.replace(`${s}`,`vec${u} ${v}[${e.length}] = vec${u}[](${M}); + ${g} + `)}else r=r.replace(`${l}`,""),r=r.replace(`${s}`,""),(d=n==null?void 0:n.attributes[t])!=null&&d.array||De&&console.error(`use-shader-fx:geometry.attributes.${t}.array is not found`);return r},Be=(e,n,t,r)=>{var m;let u=[];if(e&&e.length>0){(m=n==null?void 0:n.attributes[t])!=null&&m.array?u=[n.attributes[t].array,...e]:u=e;const l=Math.max(...u.map(s=>s.length));u.forEach((s,v)=>{if(s.length{let t="";const r={};let u="mapArrayColor = ";return e&&e.length>0?(e.forEach((l,s)=>{const v=`vMapArrayIndex < ${s}.1`,g=`texture2D(uMapArray${s}, uv)`;u+=`( ${v} ) ? ${g} : `,t+=` + uniform sampler2D uMapArray${s}; + `,r[`uMapArray${s}`]={value:l}}),u+="vec4(1.);",t+="bool isMapArray = true;",r.uMapArrayLength={value:e.length}):(u+="vec4(1.0);",t+="bool isMapArray = false;",r.uMapArrayLength={value:0}),{rewritedFragmentShader:n.replace("#usf ",u).replace("#usf ",t),mapArrayUniforms:r}},Nt=({size:e,dpr:n,geometry:t,positions:r,uvs:u,mapArray:m,uniforms:l,onBeforeCompile:s})=>{const v=i.useMemo(()=>Be(r,t,"position",3),[r,t]),g=i.useMemo(()=>Be(u,t,"uv",2),[u,t]),d=i.useMemo(()=>{v.length!==g.length&&De&&console.log("use-shader-fx:positions and uvs are not matched");const M=Ve(g,t,"uv",Ve(v,t,"position",jt,3),2),{rewritedFragmentShader:a,mapArrayUniforms:h}=qt(m,Wt),c=new o.ShaderMaterial({vertexShader:M,fragmentShader:a,blending:o.AdditiveBlending,...z,transparent:!0,uniforms:{uResolution:{value:new o.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:D},uIsPicture:{value:!1},uAlphaPicture:{value:D},uIsAlphaPicture:{value:!1},uColor0:{value:E.color0},uColor1:{value:E.color1},uColor2:{value:E.color2},uColor3:{value:E.color3},uMap:{value:D},uIsMap:{value:!1},uAlphaMap:{value:D},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:D},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},...h,...l}});return c.onBeforeCompile=B(s),c},[t,v,g,m,s,l]),y=X(e,n);return R(d)("uResolution",y.clone()),{material:d,modifiedPositions:v,modifiedUvs:g}},ze=({size:e,dpr:n,scene:t=!1,geometry:r,positions:u,uvs:m,mapArray:l,uniforms:s,onBeforeCompile:v})=>{const g=U(n),d=i.useMemo(()=>{const b=r||new o.SphereGeometry(1,32,32);return b.setIndex(null),b.deleteAttribute("normal"),b},[r]),{material:y,modifiedPositions:M,modifiedUvs:a}=Nt({size:e,dpr:g.shader,geometry:d,positions:u,uvs:m,mapArray:l,uniforms:s,onBeforeCompile:v}),{points:h,interactiveMesh:c}=$t({scene:t,geometry:d,material:y}),p=R(y),f=V(y);return[i.useCallback((b,x,S)=>{b&&p("uTime",(x==null?void 0:x.beat)||b.clock.getElapsedTime()),x!==void 0&&(p("uMorphProgress",x.morphProgress),p("uBlurAlpha",x.blurAlpha),p("uBlurRadius",x.blurRadius),p("uPointSize",x.pointSize),p("uPointAlpha",x.pointAlpha),x.picture?(p("uPicture",x.picture),p("uIsPicture",!0)):x.picture===!1&&p("uIsPicture",!1),x.alphaPicture?(p("uAlphaPicture",x.alphaPicture),p("uIsAlphaPicture",!0)):x.alphaPicture===!1&&p("uIsAlphaPicture",!1),p("uColor0",x.color0),p("uColor1",x.color1),p("uColor2",x.color2),p("uColor3",x.color3),x.map?(p("uMap",x.map),p("uIsMap",!0)):x.map===!1&&p("uIsMap",!1),x.alphaMap?(p("uAlphaMap",x.alphaMap),p("uIsAlphaMap",!0)):x.alphaMap===!1&&p("uIsAlphaMap",!1),p("uWobbleStrength",x.wobbleStrength),p("uWobblePositionFrequency",x.wobblePositionFrequency),p("uWobbleTimeFrequency",x.wobbleTimeFrequency),p("uWarpStrength",x.warpStrength),p("uWarpPositionFrequency",x.warpPositionFrequency),p("uWarpTimeFrequency",x.warpTimeFrequency),x.displacement?(p("uDisplacement",x.displacement),p("uIsDisplacement",!0)):x.displacement===!1&&p("uIsDisplacement",!1),p("uDisplacementIntensity",x.displacementIntensity),p("uDisplacementColorIntensity",x.displacementColorIntensity),p("uSizeRandomIntensity",x.sizeRandomIntensity),p("uSizeRandomTimeFrequency",x.sizeRandomTimeFrequency),p("uSizeRandomMin",x.sizeRandomMin),p("uSizeRandomMax",x.sizeRandomMax),p("uDivergence",x.divergence),p("uDivergencePoint",x.divergencePoint),f(S))},[p,f]),{points:h,interactiveMesh:c,positions:M,uvs:a}]},E=Object.freeze({morphProgress:0,blurAlpha:.9,blurRadius:.05,pointSize:.05,pointAlpha:1,picture:!1,alphaPicture:!1,color0:new o.Color(16711680),color1:new o.Color(65280),color2:new o.Color(255),color3:new o.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 o.Vector3(0),beat:!1}),Gt=({size:e,dpr:n,samples:t,isSizeUpdate:r,camera:u,geometry:m,positions:l,uvs:s,uniforms:v,onBeforeCompile:g})=>{const d=U(n),y=i.useMemo(()=>new o.Scene,[]),[M,{points:a,interactiveMesh:h,positions:c,uvs:p}]=ze({scene:y,size:e,dpr:n,geometry:m,positions:l,uvs:s,uniforms:v,onBeforeCompile:g}),[f,w]=j({scene:y,camera:u,size:e,dpr:d.fbo,samples:t,isSizeUpdate:r,depthBuffer:!0}),b=i.useCallback((S,_,T)=>(M(S,_,T),w(S.gl)),[w,M]),x=i.useCallback((S,_)=>{M(null,S,_)},[M]);return[b,x,{scene:y,points:a,interactiveMesh:h,renderTarget:f,output:f.texture,positions:c,uvs:p}]};function Kt(e,n=1e-4){n=Math.max(n,Number.EPSILON);const t={},r=e.getIndex(),u=e.getAttribute("position"),m=r?r.count:u.count;let l=0;const s=Object.keys(e.attributes),v={},g={},d=[],y=["getX","getY","getZ","getW"];for(let c=0,p=s.length;c[]))}const M=Math.log10(1/n),a=Math.pow(10,M);for(let c=0;c 0.0) { + distortionNormal = uDistortion * vec3(snoiseFractal(vec3((pos * uDistortionScale + temporalOffset))), snoiseFractal(vec3(pos.zxy * uDistortionScale - temporalOffset)), snoiseFractal(vec3(pos.yxz * uDistortionScale + temporalOffset))); +} + +for (float i = 0.0; i < uRefractionSamples; i ++) { + vec3 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); + + transmissionR = getIBLVolumeRefraction( + sampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90, + pos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness + thickness_smear * (i + randomCoords) / uRefractionSamples, + material.attenuationColor, material.attenuationDistance + ).r; + transmissionG = getIBLVolumeRefraction( + sampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90, + pos, modelMatrix, viewMatrix, projectionMatrix, material.ior * (1.0 + uChromaticAberration * (i + randomCoords) / uRefractionSamples) , material.thickness + thickness_smear * (i + randomCoords) / uRefractionSamples, + material.attenuationColor, material.attenuationDistance + ).g; + transmissionB = getIBLVolumeRefraction( + sampleNorm, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90, + pos, modelMatrix, viewMatrix, projectionMatrix, material.ior * (1.0 + 2.0 * uChromaticAberration * (i + randomCoords) / uRefractionSamples), material.thickness + thickness_smear * (i + randomCoords) / uRefractionSamples, + material.attenuationColor, material.attenuationDistance + ).b; + transmission.r += transmissionR; + transmission.g += transmissionG; + transmission.b += transmissionB; +} + +transmission /= uRefractionSamples; + +totalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission ); + +#endif`;const Oe=e=>{let n=e;return n=n.replace("#include ",` + vec3 objectNormal = usf_Normal; + #ifdef USE_TANGENT + vec3 objectTangent = vec3( tangent.xyz ); + #endif`),n=n.replace("#include ",` + vec3 transformed = usf_Position;`),n=n.replace("void main() {",` + uniform float uTime; + uniform float uWobblePositionFrequency; + uniform float uWobbleTimeFrequency; + uniform float uWobbleStrength; + uniform float uWarpPositionFrequency; + uniform float uWarpTimeFrequency; + uniform float uWarpStrength; + attribute vec4 tangent; + varying float vWobble; + varying vec2 vPosition; + // edge + varying vec3 vEdgeNormal; + varying vec3 vEdgeViewPosition; + #usf + void main() { + `),n=n.replace("void main() {",` + void main() { + vec3 usf_Position = position; + vec3 usf_Normal = normal; + vec3 biTangent = cross(normal, tangent.xyz); + + // Neighbours positions + float shift = 0.01; + vec3 positionA = usf_Position + tangent.xyz * shift; + vec3 positionB = usf_Position + biTangent * shift; + + // wobble + float wobble = (uWobbleStrength > 0.) ? getWobble(usf_Position) : 0.0; + float wobblePositionA = (uWobbleStrength > 0.) ? getWobble(positionA) : 0.0; + float wobblePositionB = (uWobbleStrength > 0.) ? getWobble(positionB) : 0.0; + + usf_Position += wobble * normal; + positionA += wobblePositionA * normal; + positionB += wobblePositionB * normal; + + // Compute normal + vec3 toA = normalize(positionA - usf_Position); + vec3 toB = normalize(positionB - usf_Position); + usf_Normal = cross(toA, toB); + + // Varying + vPosition = usf_Position.xy; + vWobble = wobble/uWobbleStrength; + + vEdgeNormal = normalize(normalMatrix * usf_Normal); + vec4 viewPosition = viewMatrix * modelMatrix * vec4(usf_Position, 1.0); + vEdgeViewPosition = normalize(viewPosition.xyz); + `),n},Yt=({baseMaterial:e,materialParameters:n,onBeforeCompile:t,depthOnBeforeCompile:r,isCustomTransmission:u=!1,uniforms:m})=>{const{material:l,depthMaterial:s}=i.useMemo(()=>{const v=new(e||o.MeshPhysicalMaterial)(n||{});Object.assign(v.userData,{uniforms:{uTime:{value:0},uWobblePositionFrequency:{value:W.wobblePositionFrequency},uWobbleTimeFrequency:{value:W.wobbleTimeFrequency},uWobbleStrength:{value:W.wobbleStrength},uWarpPositionFrequency:{value:W.warpPositionFrequency},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:W.chromaticAberration},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},...m}}),v.onBeforeCompile=(d,y)=>{Object.assign(d.uniforms,v.userData.uniforms),d.vertexShader=Oe(d.vertexShader),d.fragmentShader=d.fragmentShader.replace("#include ",` + #include + + if (uEdgeThreshold > 0.0) { + float edgeThreshold = dot(vEdgeNormal, -vEdgeViewPosition); + diffuseColor = edgeThreshold < uEdgeThreshold ? vec4(uEdgeColor, 1.0) : mix(diffuseColor, usf_DiffuseColor, uColorMix); + } else { + diffuseColor = mix(diffuseColor, usf_DiffuseColor, uColorMix); + } + `),d.fragmentShader=d.fragmentShader.replace("void main() {",` + uniform vec3 uColor0; + uniform vec3 uColor1; + uniform vec3 uColor2; + uniform vec3 uColor3; + uniform float uColorMix; + uniform float uEdgeThreshold; + uniform vec3 uEdgeColor; + + // transmission + uniform float uChromaticAberration; + uniform float uAnisotropicBlur; + uniform float uTime; + uniform float uDistortion; + uniform float uDistortionScale; + uniform float uTemporalDistortion; + uniform float uRefractionSamples; + + float rand(float n){return fract(sin(n) * 43758.5453123);} + #usf + + varying float vWobble; + varying vec2 vPosition; + varying vec3 vEdgeNormal; + varying vec3 vEdgeViewPosition; + + void main(){ + vec4 usf_DiffuseColor = vec4(1.0); + float colorWobbleMix = smoothstep(-1.,1.,vWobble); + vec2 colorPosMix = vec2(smoothstep(-1.,1.,vPosition.x),smoothstep(-1.,1.,vPosition.y)); + + usf_DiffuseColor.rgb = mix(mix(uColor0, uColor1, colorPosMix.x), mix(uColor2, uColor3, colorPosMix.y), colorWobbleMix); + `),v.type==="MeshPhysicalMaterial"&&u&&(d.fragmentShader=d.fragmentShader.replace("#include ",`${Xt}`),d.fragmentShader=d.fragmentShader.replace("#include ",`${Ht}`)),B(t)(d,y)},v.needsUpdate=!0;const g=new o.MeshDepthMaterial({depthPacking:o.RGBADepthPacking});return g.onBeforeCompile=(d,y)=>{Object.assign(d.uniforms,v.userData.uniforms),d.vertexShader=Oe(d.vertexShader),B(r)(d,y)},g.needsUpdate=!0,{material:v,depthMaterial:g}},[n,e,t,r,m,u]);return{material:l,depthMaterial:s}},Ue=({scene:e=!1,geometry:n,isCustomTransmission:t,baseMaterial:r,materialParameters:u,onBeforeCompile:m,depthOnBeforeCompile:l,uniforms:s})=>{const v=i.useMemo(()=>{let p=n||new o.IcosahedronGeometry(2,20);return p=Kt(p),p.computeTangents(),p},[n]),{material:g,depthMaterial:d}=Yt({baseMaterial:r,materialParameters:u,onBeforeCompile:m,depthOnBeforeCompile:l,uniforms:s,isCustomTransmission:t}),y=L(e,v,g,o.Mesh),M=g.userData,a=R(M),h=V(M);return[i.useCallback((p,f,w)=>{p&&a("uTime",(f==null?void 0:f.beat)||p.clock.getElapsedTime()),f!==void 0&&(a("uWobbleStrength",f.wobbleStrength),a("uWobblePositionFrequency",f.wobblePositionFrequency),a("uWobbleTimeFrequency",f.wobbleTimeFrequency),a("uWarpStrength",f.warpStrength),a("uWarpPositionFrequency",f.warpPositionFrequency),a("uWarpTimeFrequency",f.warpTimeFrequency),a("uColor0",f.color0),a("uColor1",f.color1),a("uColor2",f.color2),a("uColor3",f.color3),a("uColorMix",f.colorMix),a("uEdgeThreshold",f.edgeThreshold),a("uEdgeColor",f.edgeColor),a("uChromaticAberration",f.chromaticAberration),a("uAnisotropicBlur",f.anisotropicBlur),a("uDistortion",f.distortion),a("uDistortionScale",f.distortionScale),a("uRefractionSamples",f.refractionSamples),a("uTemporalDistortion",f.temporalDistortion),h(w))},[a,h]),{mesh:y,depthMaterial:d}]},W=Object.freeze({wobbleStrength:.3,wobblePositionFrequency:.3,wobbleTimeFrequency:.3,warpStrength:.3,warpPositionFrequency:.3,warpTimeFrequency:.3,color0:new o.Color(16711680),color1:new o.Color(65280),color2:new o.Color(255),color3:new o.Color(16776960),colorMix:1,edgeThreshold:0,edgeColor:new o.Color(0),chromaticAberration:.1,anisotropicBlur:.1,distortion:0,distortionScale:.1,temporalDistortion:0,refractionSamples:6,beat:!1}),Qt=({size:e,dpr:n,samples:t,isSizeUpdate:r,camera:u,geometry:m,baseMaterial:l,materialParameters:s,uniforms:v,onBeforeCompile:g,depthOnBeforeCompile:d,isCustomTransmission:y})=>{const M=U(n),a=i.useMemo(()=>new o.Scene,[]),[h,{mesh:c,depthMaterial:p}]=Ue({baseMaterial:l,materialParameters:s,scene:a,geometry:m,uniforms:v,onBeforeCompile:g,depthOnBeforeCompile:d,isCustomTransmission:y}),[f,w]=j({scene:a,camera:u,size:e,dpr:M.fbo,samples:t,isSizeUpdate:r,depthBuffer:!0}),b=i.useCallback((S,_,T)=>(h(S,_,T),w(S.gl)),[w,h]),x=i.useCallback((S,_)=>{h(null,S,_)},[h]);return[b,x,{scene:a,mesh:c,depthMaterial:p,renderTarget:f,output:f.texture}]},Zt=(e,n,t)=>{const r=i.useMemo(()=>{const u=new o.Mesh(n,t);return e.add(u),u},[n,t,e]);return i.useEffect(()=>()=>{e.remove(r),n.dispose(),t.dispose()},[e,n,t,r]),r},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 Jt(e){let n=Math.sin(e*12.9898)*43758.5453;return n-Math.floor(n)}const er=(e,n="easeOutQuart")=>{const t=e/60,r=de[n];return i.useCallback(m=>{let l=m.getElapsedTime()*t;const s=Math.floor(l),v=r(l-s);l=v+s;const g=Jt(s);return{beat:l,floor:s,fract:v,hash:g}},[t,r])},nr=(e=60)=>{const n=i.useMemo(()=>1/Math.max(Math.min(e,60),1),[e]),t=i.useRef(null);return i.useCallback(u=>{const m=u.getElapsedTime();return t.current===null||m-t.current>=n?(t.current=m,!0):!1},[n])},tr=e=>{var r,u;const n=(r=e.dom)==null?void 0:r.length,t=(u=e.texture)==null?void 0:u.length;return!n||!t||n!==t};var rr=`varying vec2 vUv; + +void main() { + vUv = uv; + gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0); +}`,or=`precision highp float; + +varying vec2 vUv; +uniform sampler2D u_texture; +uniform vec2 u_textureResolution; +uniform vec2 u_resolution; +uniform float u_borderRadius; + +void main() { + + float screenAspect = u_resolution.x / u_resolution.y; + float textureAspect = u_textureResolution.x / u_textureResolution.y; + vec2 ratio = vec2( + min(screenAspect / textureAspect, 1.0), + min(textureAspect / screenAspect, 1.0) + ); + + vec2 adjustedUv = vUv * ratio + (1.0 - ratio) * 0.5; + vec3 textureColor = texture2D(u_texture, adjustedUv).rgb; + float textureAlpha = texture2D(u_texture, adjustedUv).a; + + + float maxSide = max(u_resolution.x, u_resolution.y); + float minSide = min(u_resolution.x, u_resolution.y); + vec2 aspect = u_resolution / maxSide; + vec2 alphaUv = vUv - 0.5; + + float borderRadius = min(u_borderRadius, minSide * 0.5); + vec2 offset = vec2(borderRadius) / u_resolution; + vec2 alphaXY = smoothstep(vec2(0.5 - offset), vec2(0.5 - offset - 0.001), abs(alphaUv)); + float alpha = min(1.0, alphaXY.x + alphaXY.y); + + vec2 alphaUv2 = abs(vUv - 0.5); + float radius = borderRadius / maxSide; + alphaUv2 = (alphaUv2 - 0.5) * aspect + radius; + float roundAlpha = smoothstep(radius + 0.001, radius, length(alphaUv2)); + + alpha = min(1.0, alpha + roundAlpha); + + + alpha *= textureAlpha; + + gl_FragColor = vec4(textureColor, alpha); +}`;const ar=({params:e,scene:n,uniforms:t,onBeforeCompile:r})=>{n.children.length>0&&(n.children.forEach(u=>{u instanceof o.Mesh&&(u.geometry.dispose(),u.material.dispose())}),n.remove(...n.children)),e.texture.forEach((u,m)=>{const l=new o.ShaderMaterial({uniforms:{u_texture:{value:u},u_textureResolution:{value:new o.Vector2(0,0)},u_resolution:{value:new o.Vector2(0,0)},u_borderRadius:{value:e.boderRadius[m]?e.boderRadius[m]:0},...t},vertexShader:rr,fragmentShader:or,...z,transparent:!0});l.onBeforeCompile=B(r);const s=new o.Mesh(new o.PlaneGeometry(1,1),l);n.add(s)})},ur=()=>{const e=i.useRef([]),n=i.useRef([]);return i.useCallback(({isIntersectingRef:r,isIntersectingOnceRef:u,params:m})=>{e.current.length>0&&e.current.forEach((s,v)=>{s.unobserve(n.current[v])}),n.current=[],e.current=[];const l=new Array(m.dom.length).fill(!1);r.current=[...l],u.current=[...l],m.dom.forEach((s,v)=>{const g=y=>{y.forEach(M=>{m.onIntersect[v]&&m.onIntersect[v](M),r.current[v]=M.isIntersecting})},d=new IntersectionObserver(g,{rootMargin:"0px",threshold:0});d.observe(s),e.current.push(d),n.current.push(s)})},[])},ir=()=>{const e=i.useRef([]),n=i.useCallback(({params:t,customParams:r,size:u,resolutionRef:m,scene:l,isIntersectingRef:s})=>{l.children.length!==e.current.length&&(e.current=new Array(l.children.length)),l.children.forEach((v,g)=>{var M,a,h,c,p,f;const d=t.dom[g];if(!d)return;const y=d.getBoundingClientRect();if(e.current[g]=y,v.scale.set(y.width,y.height,1),v.position.set(y.left+y.width*.5-u.width*.5,-y.top-y.height*.5+u.height*.5,0),s.current[g]&&(t.rotation[g]&&v.rotation.copy(t.rotation[g]),v instanceof o.Mesh)){const w=v.material,b=R(w),x=V(w);b("u_texture",t.texture[g]),b("u_textureResolution",[((h=(a=(M=t.texture[g])==null?void 0:M.source)==null?void 0:a.data)==null?void 0:h.width)||0,((f=(p=(c=t.texture[g])==null?void 0:c.source)==null?void 0:p.data)==null?void 0:f.height)||0]),b("u_resolution",m.current.set(y.width,y.height)),b("u_borderRadius",t.boderRadius[g]?t.boderRadius[g]:0),x(r)}})},[]);return[e.current,n]},sr=()=>{const e=i.useRef([]),n=i.useRef([]),t=i.useCallback((r,u=!1)=>{e.current.forEach((l,s)=>{l&&(n.current[s]=!0)});const m=u?[...n.current]:[...e.current];return r<0?m:m[r]},[]);return{isIntersectingRef:e,isIntersectingOnceRef:n,isIntersecting:t}},lr=e=>({onView:t,onHidden:r})=>{const u=i.useRef(!1);i.useEffect(()=>{let m;const l=()=>{e.current.some(s=>s)?u.current||(t&&t(),u.current=!0):u.current&&(r&&r(),u.current=!1),m=requestAnimationFrame(l)};return m=requestAnimationFrame(l),()=>{cancelAnimationFrame(m)}},[t,r])},Ee={texture:[],dom:[],boderRadius:[],rotation:[],onIntersect:[]},cr=({size:e,dpr:n,samples:t,isSizeUpdate:r,uniforms:u,onBeforeCompile:m},l=[])=>{const s=U(n),v=i.useMemo(()=>new o.Scene,[]),g=k(e),[d,y]=j({scene:v,camera:g,size:e,dpr:s.fbo,samples:t,isSizeUpdate:r}),[M,a]=$({...Ee,updateKey:performance.now()}),[h,c]=ir(),p=i.useRef(new o.Vector2(0,0)),[f,w]=i.useState(!0);i.useMemo(()=>w(!0),l);const b=i.useRef(null),x=i.useMemo(()=>D,[]),S=ur(),{isIntersectingOnceRef:_,isIntersectingRef:T,isIntersecting:I}=sr(),A=lr(T),F=i.useMemo(()=>(O,q)=>{a(O),c({params:M,customParams:q,size:e,resolutionRef:p,scene:v,isIntersectingRef:T})},[T,a,c,e,v,M]);return[i.useCallback((O,q,ae)=>{const{gl:H,size:G}=O;if(F(q,ae),tr(M))return x;if(f){if(b.current===M.updateKey)return x;b.current=M.updateKey}return f&&(ar({params:M,size:G,scene:v,uniforms:u,onBeforeCompile:m}),S({isIntersectingRef:T,isIntersectingOnceRef:_,params:M}),w(!1)),y(H)},[y,u,S,m,f,v,M,_,T,x,F]),F,{scene:v,camera:g,renderTarget:d,output:d.texture,isIntersecting:I,DOMRects:h,intersections:T.current,useDomView:A}]},vr=({scene:e,camera:n,size:t,dpr:r=!1,isSizeUpdate:u=!1,samples:m=0,depthBuffer:l=!1,depthTexture:s=!1},v)=>{const g=i.useRef([]),d=X(t,r);g.current=i.useMemo(()=>Array.from({length:v},()=>{const M=new o.WebGLRenderTarget(d.x,d.y,{...me,samples:m,depthBuffer:l});return s&&(M.depthTexture=new o.DepthTexture(d.x,d.y,o.FloatType)),M}),[v]),u&&g.current.forEach(M=>M.setSize(d.x,d.y)),i.useEffect(()=>{const M=g.current;return()=>{M.forEach(a=>a.dispose())}},[v]);const y=i.useCallback((M,a,h)=>{const c=g.current[a];return he({gl:M,scene:e,camera:n,fbo:c,onBeforeRender:()=>h&&h({read:c.texture})}),c.texture},[e,n]);return[g.current,y]};C.ALPHABLENDING_PARAMS=Ae,C.BLANK_PARAMS=Fe,C.BLENDING_PARAMS=le,C.BRIGHTNESSPICKER_PARAMS=pe,C.BRUSH_PARAMS=Z,C.CHROMAKEY_PARAMS=Q,C.COLORSTRATA_PARAMS=Y,C.COSPALETTE_PARAMS=ie,C.COVERTEXTURE_PARAMS=Ie,C.DELTA_TIME=Se,C.DOMSYNCER_PARAMS=Ee,C.DUOTONE_PARAMS=xe,C.Easing=de,C.FBO_OPTION=me,C.FLUID_PARAMS=Pe,C.FXBLENDING_PARAMS=Ce,C.FXTEXTURE_PARAMS=te,C.HSV_PARAMS=Me,C.MARBLE_PARAMS=oe,C.MORPHPARTICLES_PARAMS=E,C.MOTIONBLUR_PARAMS=fe,C.NOISE_PARAMS=ne,C.RIPPLE_PARAMS=Re,C.SIMPLEBLUR_PARAMS=_e,C.WAVE_PARAMS=ce,C.WOBBLE3D_PARAMS=W,C.renderFBO=he,C.setCustomUniform=V,C.setUniform=R,C.useAddMesh=Zt,C.useAlphaBlending=mt,C.useBeat=er,C.useBlank=kt,C.useBlending=Yn,C.useBrightnessPicker=ot,C.useBrush=nn,C.useCamera=k,C.useChromaKey=Ot,C.useColorStrata=Bn,C.useCopyTexture=vr,C.useCosPalette=jn,C.useCoverTexture=yt,C.useCreateMorphParticles=ze,C.useCreateWobble3D=Ue,C.useDomSyncer=cr,C.useDoubleFBO=re,C.useDuoTone=Gn,C.useFPSLimiter=nr,C.useFluid=Sn,C.useFxBlending=st,C.useFxTexture=et,C.useHSV=gt,C.useMarble=En,C.useMorphParticles=Gt,C.useMotionBlur=Pt,C.useNoise=An,C.useParams=$,C.usePointer=ge,C.useResolution=X,C.useRipple=Tn,C.useSimpleBlur=_t,C.useSingleFBO=j,C.useWave=Ft,C.useWobble3D=Qt,Object.defineProperty(C,Symbol.toStringTag,{value:"Module"})}); +//# sourceMappingURL=use-shader-fx.umd.cjs.map diff --git a/packages/use-shader-fx/build/use-shader-fx.umd.cjs.map b/packages/use-shader-fx/build/use-shader-fx.umd.cjs.map new file mode 100644 index 00000000..172fa0f9 --- /dev/null +++ b/packages/use-shader-fx/build/use-shader-fx.umd.cjs.map @@ -0,0 +1 @@ +{"version":3,"file":"use-shader-fx.umd.cjs","sources":["../src/fxs/interactions/useBrush/shader/main.vert","../src/fxs/interactions/useBrush/shader/main.frag","../src/utils/useResolution.ts","../src/utils/setUniforms.ts","../src/utils/useAddObject.ts","../src/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/planeVert.glsl","../src/libs/shaders/resolveShaders.ts","../src/utils/setOnBeforeCompile.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","../node_modules/three-stdlib/utils/BufferGeometryUtils.js","../src/fxs/3D/useWobble3D/shaders/transmission_pars_fragment.glsl","../src/fxs/3D/useWobble3D/shaders/transmission_fragment.glsl","../src/fxs/3D/useWobble3D/useMaterial.ts","../src/fxs/3D/useWobble3D/useCreateWobble3D.ts","../src/fxs/3D/useWobble3D/index.ts","../src/utils/useAddMesh.ts","../src/libs/easing.ts","../src/misc/useBeat.ts","../src/misc/useFPSLimiter.ts","../src/misc/useDomSyncer/utils/errorHandler.ts","../src/misc/useDomSyncer/shader/main.vert","../src/misc/useDomSyncer/shader/main.frag","../src/misc/useDomSyncer/utils/createMesh.ts","../src/misc/useDomSyncer/utils/useIntersectionHandler.ts","../src/misc/useDomSyncer/utils/useUpdateDomRect.ts","../src/misc/useDomSyncer/utils/useIsIntersecting.ts","../src/misc/useDomSyncer/utils/createUseDomView.ts","../src/misc/useDomSyncer/index.ts","../src/misc/useCopyTexture.ts"],"sourcesContent":["#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 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}","import * as THREE from \"three\";\n\nimport wobble3D from \"./shaderChunk/wobble3D.glsl\";\nimport snoise from \"./shaderChunk/snoise.glsl\";\nimport coverTexture from \"./shaderChunk/coverTexture.glsl\";\nimport fxBlending from \"./shaderChunk/fxBlending.glsl\";\nimport planeVert from \"./shaderChunk/planeVert.glsl\";\n\nconst SHADER_CHUNK: { [key: string]: string } = {\n wobble3D,\n snoise,\n coverTexture,\n fxBlending,\n planeVert,\n};\n\nconst includePattern = /^[ \\t]*#usf +<([\\w\\d./]+)>/gm;\n\nfunction includeReplacer(match: string, include: string) {\n let string = SHADER_CHUNK[include] || \"\";\n return resolveIncludes(string);\n}\n\nfunction resolveIncludes(string: string) {\n return string.replace(includePattern, includeReplacer);\n}\n\nexport const resolveShaders = (\n parameters: THREE.WebGLProgramParametersWithUniforms\n) => {\n parameters.vertexShader = resolveIncludes(parameters.vertexShader);\n parameters.fragmentShader = resolveIncludes(parameters.fragmentShader);\n};\n","import * as THREE from \"three\";\nimport { resolveShaders } from \"../libs/shaders/resolveShaders\";\n\ntype OnBeforeCompile = (\n parameters: THREE.WebGLProgramParametersWithUniforms,\n renderer: THREE.WebGLRenderer\n) => void;\n\nexport const setOnBeforeCompile = (\n onBeforeCompile?: OnBeforeCompile\n): OnBeforeCompile => {\n return (parameters, renderer) => {\n onBeforeCompile && onBeforeCompile(parameters, renderer);\n resolveShaders(parameters);\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 { 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uBuffer: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent\n transparent: true,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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_OPTION: THREE.RenderTargetOptions = {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n type: THREE.HalfFloatType,\n stencilBuffer: false,\n};\n\nexport type UseFboProps = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n size: Size;\n /** If dpr is set, dpr will be multiplied, default : `false` */\n dpr?: number | false;\n /** Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false` */\n isSizeUpdate?: boolean;\n /** Defines the count of MSAA samples. Can only be used with WebGL 2. default : `0.0` */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, default : `false` */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. default : `false` */\n depthTexture?: boolean;\n};\n\nexport const renderFBO = ({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender,\n onSwap,\n}: {\n gl: THREE.WebGLRenderer;\n fbo: THREE.WebGLRenderTarget;\n scene: THREE.Scene;\n camera: THREE.Camera;\n onBeforeRender: () => void;\n onSwap?: () => void;\n}) => {\n gl.setRenderTarget(fbo);\n onBeforeRender();\n gl.clear();\n gl.render(scene, camera);\n onSwap && onSwap();\n gl.setRenderTarget(null);\n gl.clear();\n};\n\ntype UpdateRenderTarget = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseSingleFBOReturn = [THREE.WebGLRenderTarget, UpdateRenderTarget];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [THREE.WebGLRenderTarget , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useSingleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseSingleFBOReturn => {\n const renderTarget = useRef();\n\n const resolution = useResolution(size, dpr);\n\n renderTarget.current = useMemo(\n () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { FBO_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget | null;\n write: THREE.WebGLRenderTarget | null;\n};\n\ninterface WebGLDoubleRenderTarget extends DoubleRenderTarget {\n swap: () => void;\n}\n\ntype FBOUpdateFunction = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({\n read,\n write,\n }: {\n read: THREE.Texture;\n write: THREE.Texture;\n }) => void\n) => THREE.Texture;\n\ntype UseDoubleFBOReturn = [\n { read: THREE.WebGLRenderTarget; write: THREE.WebGLRenderTarget },\n FBOUpdateFunction\n];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default : `false`\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false`\n * @returns [{read:THREE.WebGLRenderTarget,write:THREE.WebGLRenderTarget} , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useDoubleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseDoubleFBOReturn => {\n const renderTarget = useRef({\n read: null,\n write: null,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n });\n\n const resolution = useResolution(size, dpr);\n\n const initRenderTargets = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n\n if (depthTexture) {\n read.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n write.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n\n return { read, write };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n renderTarget.current.read = initRenderTargets.read;\n renderTarget.current.write = initRenderTargets.write;\n\n if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, []);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current;\n renderFBO({\n gl,\n scene,\n camera,\n fbo: fbo.write!,\n onBeforeRender: () =>\n onBeforeRender &&\n onBeforeRender({\n read: fbo.read!.texture,\n write: fbo.write!.texture,\n }),\n onSwap: () => fbo.swap(),\n });\n return fbo.read?.texture as THREE.Texture;\n },\n [scene, camera]\n );\n\n return [\n { read: renderTarget.current.read, write: renderTarget.current.write },\n updateRenderTarget,\n ];\n};\n","import { Dpr } from \"../fxs/types\";\n\nexport const getDpr = (\n dpr: Dpr\n): { shader: number | false; fbo: number | false } => {\n if (typeof dpr === \"number\") {\n return { shader: dpr, fbo: dpr };\n }\n return {\n shader: dpr.shader ?? false,\n fbo: dpr.fbo ?? false,\n };\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { PointerValues, usePointer } from \"../../../misc/usePointer\";\nimport {\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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const pressureEnd = useRef(null);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class AdvectionMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uSource: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n dt: { value: number };\n dissipation: { value: number };\n };\n}\n\nexport const useAdvectionMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class DivergenceMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useDivergenceMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const divergenceMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class PressureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uDivergence: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const usePressureMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const pressureMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: null },\n uDivergence: { value: null },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class CurlMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useCurlMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const curlMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class VorticityMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uCurl: { value: THREE.Texture };\n curl: { value: number };\n dt: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useVorticityMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const vorticityMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n uCurl: { value: null },\n curl: { value: 0 },\n dt: { value: DELTA_TIME },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class ClearMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n value: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useClearMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n value: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class GradientSubtractMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useGradientSubtractMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const gradientSubtractMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: DEFAULT_TEXTURE },\n uVelocity: { value: DEFAULT_TEXTURE },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\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 = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const splatMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 density_dissipation?: number;\n /** velocity dissipation , default : `0.99` */\n velocity_dissipation?: number;\n /** velocity acceleration , default : `10.0` */\n velocity_acceleration?: number;\n /** pressure dissipation , default : `0.9` */\n pressure_dissipation?: number;\n /** pressure iterations. affects performance , default : `20` */\n pressure_iterations?: number;\n /** curl_strength , default : `35` */\n curl_strength?: number;\n /** splat radius , default : `0.002` */\n splat_radius?: number;\n /** Fluid Color.THREE.Vector3 Alternatively, it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default : `THREE.Vector3(1.0, 1.0, 1.0)` */\n fluid_color?:\n | ((velocity: THREE.Vector2) => THREE.Vector3)\n | THREE.Vector3\n | THREE.Color;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type FluidObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n materials: FluidMaterials;\n camera: THREE.Camera;\n renderTarget: {\n velocity: DoubleRenderTarget;\n density: DoubleRenderTarget;\n curl: THREE.WebGLRenderTarget;\n divergence: THREE.WebGLRenderTarget;\n pressure: DoubleRenderTarget;\n };\n output: THREE.Texture;\n};\n\nexport const FLUID_PARAMS: FluidParams = Object.freeze({\n density_dissipation: 0.98,\n velocity_dissipation: 0.99,\n velocity_acceleration: 10.0,\n pressure_dissipation: 0.9,\n pressure_iterations: 20,\n curl_strength: 35,\n splat_radius: 0.002,\n fluid_color: new THREE.Vector3(1.0, 1.0, 1.0),\n pointerValues: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFluid = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n customFluidProps,\n}: {\n /** you can add `onBeforeComile` of the next material.`initial`,`curl`,`vorticity`,`advection`,`divergence`,`pressure`,`clear`,`gradientSubtract`,`splat` \n\t * ```ts\n\t * fluidOnBeforeCompile: {\n vorticity: {\n onBeforeCompile: (shader) => console.log(shader),\n\t\t\t\tuniforms:{\n\t\t\t\t\thoge: { value: 0.0 },\n\t\t\t\t}\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 }),\n [scene, camera, size, samples, _dpr.fbo, isSizeUpdate]\n );\n const [velocityFBO, updateVelocityFBO] = useDoubleFBO(fboProps);\n const [densityFBO, updateDensityFBO] = useDoubleFBO(fboProps);\n const [curlFBO, updateCurlFBO] = useSingleFBO(fboProps);\n const [divergenceFBO, updateDivergenceFBO] = useSingleFBO(fboProps);\n const [pressureFBO, updatePressureFBO] = useDoubleFBO(fboProps);\n\n const 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.velocity_dissipation!\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.density_dissipation!\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.velocity_acceleration!)\n );\n updateParamsList.splat(\n \"color\",\n spaltVec.current.set(scaledDiff.x, scaledDiff.y, 1.0)\n );\n updateParamsList.splat(\"radius\", params.splat_radius!);\n });\n updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n updateParamsList.splat(\"uTarget\", read);\n const color: THREE.Vector3 | THREE.Color =\n typeof params.fluid_color === \"function\"\n ? params.fluid_color(pointerValues.velocity)\n : params.fluid_color!;\n 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.curl_strength!);\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.pressure_dissipation!);\n });\n\n setMeshMaterial(materials.pressureMaterial);\n updateParamsList.pressure(\"uDivergence\", divergenceTex);\n let pressureTexTemp: THREE.Texture;\n for (let i = 0; i < params.pressure_iterations!; 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","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}","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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\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 uniforms: {\n uOpacity: { value: 0.0 },\n uMap: { value: texture || DEFAULT_TEXTURE },\n ...uniforms,\n },\n blending: THREE.AdditiveBlending,\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent.\n transparent: true,\n });\n return mat;\n }, [texture, uniforms]);\n\n const meshArr = useMemo(() => {\n const temp = [];\n for (let i = 0; i < max; i++) {\n const clonedMat = material.clone();\n\n clonedMat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\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 }, [onBeforeCompile, 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 fadeout_speed?: number;\n /** scale rate, default : `0.3` */\n scale?: number;\n /** alpha, default : `0.6` */\n alpha?: number;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type RippleObject = {\n scene: THREE.Scene;\n meshArr: THREE.Mesh[];\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const RIPPLE_PARAMS: RippleParams = Object.freeze({\n frequency: 0.01,\n rotation: 0.05,\n fadeout_speed: 0.9,\n scale: 0.3,\n alpha: 0.6,\n pointerValues: false,\n});\n\ninterface UseRippleProps extends HooksProps {\n /** texture applied to ripple */\n texture?: THREE.Texture;\n /** ripple size, default:64 */\n scale?: number;\n /** ripple max length, default:100 */\n max?: number;\n}\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useRipple = ({\n texture,\n scale = 64,\n max = 100,\n size,\n dpr,\n samples,\n isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: UseRippleProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const 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.fadeout_speed! * mesh.scale.x + params.scale!;\n mesh.scale.y = mesh.scale.x;\n const opacity = material.uniforms.uOpacity.value;\n setUniform(material)(\n \"uOpacity\",\n opacity * params.fadeout_speed!\n );\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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTime: { value: 0.0 },\n scale: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: 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: { value: COLORSTRATA_PARAMS.laminateInterval },\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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateValue = setUniform(material);\n 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 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(MARBLE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(COSPALETTE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uColor0: { value: DUOTONE_PARAMS.color0 },\n uColor1: { value: DUOTONE_PARAMS.color1 },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { FXTEXTURE_PARAMS } from \".\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture0: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_brightness: { value: BRIGHTNESSPICKER_PARAMS.brightness },\n u_min: { value: BRIGHTNESSPICKER_PARAMS.min },\n u_max: { value: BRIGHTNESSPICKER_PARAMS.max },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n uMapIntensity: { value: FXBLENDING_PARAMS.mapIntensity },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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 uniforms,\n onBeforeCompile,\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 });\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\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\nvoid main() {\n\tvec4 tex = texture2D(u_texture, vUv);\n\tvec3 hsv = rgb2hsv(tex.rgb);\n\thsv.y *= u_saturation;\n\thsv.z *= u_brightness;\n\tvec3 final = hsv2rgb(hsv);\n\tgl_FragColor = vec4(final, tex.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { HSV_PARAMS } from \".\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_brightness: { value: HSV_PARAMS.brightness },\n u_saturation: { value: HSV_PARAMS.saturation },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n uniforms,\n onBeforeCompile,\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 });\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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture: { value: DEFAULT_TEXTURE },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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 uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] =\n useParams(COVERTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uBlurSize: { value: SIMPLEBLUR_PARAMS.blurSize },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n const 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 const iterations = params.blurPower!;\n for (let i = 0; i < iterations; i++) {\n updateValue(\"uTexture\", _tempTexture);\n _tempTexture = updateTempTexture(gl);\n }\n\n return _tempTexture;\n },\n [updateTempTexture, updateValue, 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(MOTIONBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uEpicenter: { value: WAVE_PARAMS.epicenter },\n uProgress: { value: WAVE_PARAMS.progress },\n uStrength: { value: WAVE_PARAMS.strength },\n uWidth: { value: WAVE_PARAMS.width },\n uMode: { value: 0 },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(CHROMAKEY_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene; size: Size; dpr: number | false } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uBackbuffer: { value: DEFAULT_TEXTURE },\n uTime: { value: 0 },\n uPointer: { value: new THREE.Vector2() },\n uResolution: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) as BlankMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { BlankMaterial, 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(BLANK_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n size: Size;\n dpr: number | false;\n geometry: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\n mapArray?: THREE.Texture[];\n} & MaterialProps) => {\n const modifiedPositions = useMemo(\n () => modifyAttributes(positions, geometry, \"position\", 3),\n [positions, geometry]\n );\n\n const modifiedUvs = useMemo(\n () => modifyAttributes(uvs, geometry, \"uv\", 2),\n [uvs, geometry]\n );\n\n const material = useMemo(() => {\n if (modifiedPositions.length !== modifiedUvs.length) {\n ISDEV &&\n console.log(\"use-shader-fx:positions and uvs are not matched\");\n }\n\n // vertex\n const rewritedVertexShader = rewriteVertexShader(\n modifiedUvs,\n geometry,\n \"uv\",\n rewriteVertexShader(\n modifiedPositions,\n geometry,\n \"position\",\n vertexShader,\n 3\n ),\n 2\n );\n\n // fragment\n const { rewritedFragmentShader, mapArrayUniforms } =\n rewriteFragmentShader(mapArray, fragmentShader);\n\n const mat = new THREE.ShaderMaterial({\n vertexShader: rewritedVertexShader,\n fragmentShader: rewritedFragmentShader,\n blending: THREE.AdditiveBlending,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent\n transparent: true,\n uniforms: {\n uResolution: { value: new THREE.Vector2(0, 0) },\n uMorphProgress: { value: MORPHPARTICLES_PARAMS.morphProgress },\n uBlurAlpha: { value: MORPHPARTICLES_PARAMS.blurAlpha },\n uBlurRadius: { value: MORPHPARTICLES_PARAMS.blurRadius },\n uPointSize: { value: MORPHPARTICLES_PARAMS.pointSize },\n uPointAlpha: { value: MORPHPARTICLES_PARAMS.pointAlpha },\n uPicture: { value: 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: { value: MORPHPARTICLES_PARAMS.wobbleStrength },\n uWarpPositionFrequency: {\n value: MORPHPARTICLES_PARAMS.warpPositionFrequency,\n },\n uWarpTimeFrequency: {\n value: MORPHPARTICLES_PARAMS.warpTimeFrequency,\n },\n uWarpStrength: { value: MORPHPARTICLES_PARAMS.warpStrength },\n uDisplacement: { value: 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: { value: MORPHPARTICLES_PARAMS.sizeRandomMin },\n uSizeRandomMax: { value: MORPHPARTICLES_PARAMS.sizeRandomMax },\n uDivergence: { value: MORPHPARTICLES_PARAMS.divergence },\n uDivergencePoint: { value: MORPHPARTICLES_PARAMS.divergencePoint },\n ...mapArrayUniforms,\n ...uniforms,\n },\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [\n geometry,\n modifiedPositions,\n modifiedUvs,\n mapArray,\n onBeforeCompile,\n uniforms,\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 uniforms,\n onBeforeCompile,\n}: Create3DHooksProps &\n UseCreateMorphParticlesProps): UseCreateMorphParticlesReturn => {\n const _dpr = getDpr(dpr);\n\n const morphGeometry = useMemo(() => {\n const geo = geometry || new THREE.SphereGeometry(1, 32, 32);\n geo.setIndex(null);\n // Since it is a particle, normal is not necessary\n geo.deleteAttribute(\"normal\");\n return geo;\n }, [geometry]);\n\n const { material, modifiedPositions, modifiedUvs } = useMaterial({\n size,\n dpr: _dpr.shader,\n geometry: morphGeometry,\n positions,\n uvs,\n mapArray,\n uniforms,\n onBeforeCompile,\n });\n\n const { points, interactiveMesh } = useCreateObject({\n scene,\n geometry: morphGeometry,\n material,\n });\n\n const updateValue = setUniform(material);\n const 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 camera,\n geometry,\n positions,\n uvs,\n uniforms,\n onBeforeCompile,\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 uniforms,\n onBeforeCompile,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n });\n\n const updateFx = useCallback(\n (\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 { BufferGeometry, BufferAttribute, InterleavedBuffer, InterleavedBufferAttribute, TrianglesDrawMode, TriangleFanDrawMode, TriangleStripDrawMode, Vector3, Float32BufferAttribute } from \"three\";\nimport { getWithKey } from \"../types/helpers.js\";\nconst mergeBufferGeometries = (geometries, useGroups) => {\n const isIndexed = geometries[0].index !== null;\n const attributesUsed = new Set(Object.keys(geometries[0].attributes));\n const morphAttributesUsed = new Set(Object.keys(geometries[0].morphAttributes));\n const attributes = {};\n const morphAttributes = {};\n const morphTargetsRelative = geometries[0].morphTargetsRelative;\n const mergedGeometry = new BufferGeometry();\n let offset = 0;\n geometries.forEach((geom, i) => {\n let attributesCount = 0;\n if (isIndexed !== (geom.index !== null)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.\"\n );\n return null;\n }\n for (let name in geom.attributes) {\n if (!attributesUsed.has(name)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.'\n );\n return null;\n }\n if (attributes[name] === void 0) {\n attributes[name] = [];\n }\n attributes[name].push(geom.attributes[name]);\n attributesCount++;\n }\n if (attributesCount !== attributesUsed.size) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". Make sure all geometries have the same number of attributes.\"\n );\n return null;\n }\n if (morphTargetsRelative !== geom.morphTargetsRelative) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". .morphTargetsRelative must be consistent throughout all geometries.\"\n );\n return null;\n }\n for (let name in geom.morphAttributes) {\n if (!morphAttributesUsed.has(name)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". .morphAttributes must be consistent throughout all geometries.\"\n );\n return null;\n }\n if (morphAttributes[name] === void 0)\n morphAttributes[name] = [];\n morphAttributes[name].push(geom.morphAttributes[name]);\n }\n mergedGeometry.userData.mergedUserData = mergedGeometry.userData.mergedUserData || [];\n mergedGeometry.userData.mergedUserData.push(geom.userData);\n if (useGroups) {\n let count;\n if (geom.index) {\n count = geom.index.count;\n } else if (geom.attributes.position !== void 0) {\n count = geom.attributes.position.count;\n } else {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". The geometry must have either an index or a position attribute\"\n );\n return null;\n }\n mergedGeometry.addGroup(offset, count, i);\n offset += count;\n }\n });\n if (isIndexed) {\n let indexOffset = 0;\n const mergedIndex = [];\n geometries.forEach((geom) => {\n const index = geom.index;\n for (let j = 0; j < index.count; ++j) {\n mergedIndex.push(index.getX(j) + indexOffset);\n }\n indexOffset += geom.attributes.position.count;\n });\n mergedGeometry.setIndex(mergedIndex);\n }\n for (let name in attributes) {\n const mergedAttribute = mergeBufferAttributes(attributes[name]);\n if (!mergedAttribute) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the \" + name + \" attribute.\"\n );\n return null;\n }\n mergedGeometry.setAttribute(name, mergedAttribute);\n }\n for (let name in morphAttributes) {\n const numMorphTargets = morphAttributes[name][0].length;\n if (numMorphTargets === 0)\n break;\n mergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n mergedGeometry.morphAttributes[name] = [];\n for (let i = 0; i < numMorphTargets; ++i) {\n const morphAttributesToMerge = [];\n for (let j = 0; j < morphAttributes[name].length; ++j) {\n morphAttributesToMerge.push(morphAttributes[name][j][i]);\n }\n const mergedMorphAttribute = mergeBufferAttributes(morphAttributesToMerge);\n if (!mergedMorphAttribute) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the \" + name + \" morphAttribute.\"\n );\n return null;\n }\n mergedGeometry.morphAttributes[name].push(mergedMorphAttribute);\n }\n }\n return mergedGeometry;\n};\nconst mergeBufferAttributes = (attributes) => {\n let TypedArray = void 0;\n let itemSize = void 0;\n let normalized = void 0;\n let arrayLength = 0;\n attributes.forEach((attr) => {\n if (TypedArray === void 0) {\n TypedArray = attr.array.constructor;\n }\n if (TypedArray !== attr.array.constructor) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.\"\n );\n return null;\n }\n if (itemSize === void 0)\n itemSize = attr.itemSize;\n if (itemSize !== attr.itemSize) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.\"\n );\n return null;\n }\n if (normalized === void 0)\n normalized = attr.normalized;\n if (normalized !== attr.normalized) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.\"\n );\n return null;\n }\n arrayLength += attr.array.length;\n });\n if (TypedArray && itemSize) {\n const array = new TypedArray(arrayLength);\n let offset = 0;\n attributes.forEach((attr) => {\n array.set(attr.array, offset);\n offset += attr.array.length;\n });\n return new BufferAttribute(array, itemSize, normalized);\n }\n};\nconst interleaveAttributes = (attributes) => {\n let TypedArray = void 0;\n let arrayLength = 0;\n let stride = 0;\n for (let i = 0, l = attributes.length; i < l; ++i) {\n const attribute = attributes[i];\n if (TypedArray === void 0)\n TypedArray = attribute.array.constructor;\n if (TypedArray !== attribute.array.constructor) {\n console.error(\"AttributeBuffers of different types cannot be interleaved\");\n return null;\n }\n arrayLength += attribute.array.length;\n stride += attribute.itemSize;\n }\n const interleavedBuffer = new InterleavedBuffer(new TypedArray(arrayLength), stride);\n let offset = 0;\n const res = [];\n const getters = [\"getX\", \"getY\", \"getZ\", \"getW\"];\n const setters = [\"setX\", \"setY\", \"setZ\", \"setW\"];\n for (let j = 0, l = attributes.length; j < l; j++) {\n const attribute = attributes[j];\n const itemSize = attribute.itemSize;\n const count = attribute.count;\n const iba = new InterleavedBufferAttribute(interleavedBuffer, itemSize, offset, attribute.normalized);\n res.push(iba);\n offset += itemSize;\n for (let c = 0; c < count; c++) {\n for (let k = 0; k < itemSize; k++) {\n const set = getWithKey(iba, setters[k]);\n const get = getWithKey(attribute, getters[k]);\n set(c, get(c));\n }\n }\n }\n return res;\n};\nfunction estimateBytesUsed(geometry) {\n let mem = 0;\n for (let name in geometry.attributes) {\n const attr = geometry.getAttribute(name);\n mem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n }\n const indices = geometry.getIndex();\n mem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n return mem;\n}\nfunction mergeVertices(geometry, tolerance = 1e-4) {\n tolerance = Math.max(tolerance, Number.EPSILON);\n const hashToIndex = {};\n const indices = geometry.getIndex();\n const positions = geometry.getAttribute(\"position\");\n const vertexCount = indices ? indices.count : positions.count;\n let nextIndex = 0;\n const attributeNames = Object.keys(geometry.attributes);\n const attrArrays = {};\n const morphAttrsArrays = {};\n const newIndices = [];\n const getters = [\"getX\", \"getY\", \"getZ\", \"getW\"];\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n const name = attributeNames[i];\n attrArrays[name] = [];\n const morphAttr = geometry.morphAttributes[name];\n if (morphAttr) {\n morphAttrsArrays[name] = new Array(morphAttr.length).fill(0).map(() => []);\n }\n }\n const decimalShift = Math.log10(1 / tolerance);\n const shiftMultiplier = Math.pow(10, decimalShift);\n for (let i = 0; i < vertexCount; i++) {\n const index = indices ? indices.getX(i) : i;\n let hash = \"\";\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const itemSize = attribute.itemSize;\n for (let k = 0; k < itemSize; k++) {\n hash += `${~~(attribute[getters[k]](index) * shiftMultiplier)},`;\n }\n }\n if (hash in hashToIndex) {\n newIndices.push(hashToIndex[hash]);\n } else {\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const morphAttr = geometry.morphAttributes[name];\n const itemSize = attribute.itemSize;\n const newarray = attrArrays[name];\n const newMorphArrays = morphAttrsArrays[name];\n for (let k = 0; k < itemSize; k++) {\n const getterFunc = getters[k];\n newarray.push(attribute[getterFunc](index));\n if (morphAttr) {\n for (let m = 0, ml = morphAttr.length; m < ml; m++) {\n newMorphArrays[m].push(morphAttr[m][getterFunc](index));\n }\n }\n }\n }\n hashToIndex[hash] = nextIndex;\n newIndices.push(nextIndex);\n nextIndex++;\n }\n }\n const result = geometry.clone();\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n const name = attributeNames[i];\n const oldAttribute = geometry.getAttribute(name);\n const buffer = new oldAttribute.array.constructor(attrArrays[name]);\n const attribute = new BufferAttribute(buffer, oldAttribute.itemSize, oldAttribute.normalized);\n result.setAttribute(name, attribute);\n if (name in morphAttrsArrays) {\n for (let j = 0; j < morphAttrsArrays[name].length; j++) {\n const oldMorphAttribute = geometry.morphAttributes[name][j];\n const buffer2 = new oldMorphAttribute.array.constructor(morphAttrsArrays[name][j]);\n const morphAttribute = new BufferAttribute(buffer2, oldMorphAttribute.itemSize, oldMorphAttribute.normalized);\n result.morphAttributes[name][j] = morphAttribute;\n }\n }\n }\n result.setIndex(newIndices);\n return result;\n}\nfunction toTrianglesDrawMode(geometry, drawMode) {\n if (drawMode === TrianglesDrawMode) {\n console.warn(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.\");\n return geometry;\n }\n if (drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode) {\n let index = geometry.getIndex();\n if (index === null) {\n const indices = [];\n const position = geometry.getAttribute(\"position\");\n if (position !== void 0) {\n for (let i = 0; i < position.count; i++) {\n indices.push(i);\n }\n geometry.setIndex(indices);\n index = geometry.getIndex();\n } else {\n console.error(\n \"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.\"\n );\n return geometry;\n }\n }\n const numberOfTriangles = index.count - 2;\n const newIndices = [];\n if (index) {\n if (drawMode === TriangleFanDrawMode) {\n for (let i = 1; i <= numberOfTriangles; i++) {\n newIndices.push(index.getX(0));\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n }\n } else {\n for (let i = 0; i < numberOfTriangles; i++) {\n if (i % 2 === 0) {\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i + 2));\n } else {\n newIndices.push(index.getX(i + 2));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i));\n }\n }\n }\n }\n if (newIndices.length / 3 !== numberOfTriangles) {\n console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.\");\n }\n const newGeometry = geometry.clone();\n newGeometry.setIndex(newIndices);\n newGeometry.clearGroups();\n return newGeometry;\n } else {\n console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:\", drawMode);\n return geometry;\n }\n}\nfunction computeMorphedAttributes(object) {\n if (object.geometry.isBufferGeometry !== true) {\n console.error(\"THREE.BufferGeometryUtils: Geometry is not of type BufferGeometry.\");\n return null;\n }\n const _vA = new Vector3();\n const _vB = new Vector3();\n const _vC = new Vector3();\n const _tempA = new Vector3();\n const _tempB = new Vector3();\n const _tempC = new Vector3();\n const _morphA = new Vector3();\n const _morphB = new Vector3();\n const _morphC = new Vector3();\n function _calculateMorphedAttributeData(object2, material2, attribute, morphAttribute, morphTargetsRelative2, a2, b2, c2, modifiedAttributeArray) {\n _vA.fromBufferAttribute(attribute, a2);\n _vB.fromBufferAttribute(attribute, b2);\n _vC.fromBufferAttribute(attribute, c2);\n const morphInfluences = object2.morphTargetInfluences;\n if (\n // @ts-ignore\n material2.morphTargets && morphAttribute && morphInfluences\n ) {\n _morphA.set(0, 0, 0);\n _morphB.set(0, 0, 0);\n _morphC.set(0, 0, 0);\n for (let i2 = 0, il2 = morphAttribute.length; i2 < il2; i2++) {\n const influence = morphInfluences[i2];\n const morph = morphAttribute[i2];\n if (influence === 0)\n continue;\n _tempA.fromBufferAttribute(morph, a2);\n _tempB.fromBufferAttribute(morph, b2);\n _tempC.fromBufferAttribute(morph, c2);\n if (morphTargetsRelative2) {\n _morphA.addScaledVector(_tempA, influence);\n _morphB.addScaledVector(_tempB, influence);\n _morphC.addScaledVector(_tempC, influence);\n } else {\n _morphA.addScaledVector(_tempA.sub(_vA), influence);\n _morphB.addScaledVector(_tempB.sub(_vB), influence);\n _morphC.addScaledVector(_tempC.sub(_vC), influence);\n }\n }\n _vA.add(_morphA);\n _vB.add(_morphB);\n _vC.add(_morphC);\n }\n if (object2.isSkinnedMesh) {\n object2.boneTransform(a2, _vA);\n object2.boneTransform(b2, _vB);\n object2.boneTransform(c2, _vC);\n }\n modifiedAttributeArray[a2 * 3 + 0] = _vA.x;\n modifiedAttributeArray[a2 * 3 + 1] = _vA.y;\n modifiedAttributeArray[a2 * 3 + 2] = _vA.z;\n modifiedAttributeArray[b2 * 3 + 0] = _vB.x;\n modifiedAttributeArray[b2 * 3 + 1] = _vB.y;\n modifiedAttributeArray[b2 * 3 + 2] = _vB.z;\n modifiedAttributeArray[c2 * 3 + 0] = _vC.x;\n modifiedAttributeArray[c2 * 3 + 1] = _vC.y;\n modifiedAttributeArray[c2 * 3 + 2] = _vC.z;\n }\n const geometry = object.geometry;\n const material = object.material;\n let a, b, c;\n const index = geometry.index;\n const positionAttribute = geometry.attributes.position;\n const morphPosition = geometry.morphAttributes.position;\n const morphTargetsRelative = geometry.morphTargetsRelative;\n const normalAttribute = geometry.attributes.normal;\n const morphNormal = geometry.morphAttributes.position;\n const groups = geometry.groups;\n const drawRange = geometry.drawRange;\n let i, j, il, jl;\n let group, groupMaterial;\n let start, end;\n const modifiedPosition = new Float32Array(positionAttribute.count * positionAttribute.itemSize);\n const modifiedNormal = new Float32Array(normalAttribute.count * normalAttribute.itemSize);\n if (index !== null) {\n if (Array.isArray(material)) {\n for (i = 0, il = groups.length; i < il; i++) {\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n start = Math.max(group.start, drawRange.start);\n end = Math.min(group.start + group.count, drawRange.start + drawRange.count);\n for (j = start, jl = end; j < jl; j += 3) {\n a = index.getX(j);\n b = index.getX(j + 1);\n c = index.getX(j + 2);\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else {\n start = Math.max(0, drawRange.start);\n end = Math.min(index.count, drawRange.start + drawRange.count);\n for (i = start, il = end; i < il; i += 3) {\n a = index.getX(i);\n b = index.getX(i + 1);\n c = index.getX(i + 2);\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else if (positionAttribute !== void 0) {\n if (Array.isArray(material)) {\n for (i = 0, il = groups.length; i < il; i++) {\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n start = Math.max(group.start, drawRange.start);\n end = Math.min(group.start + group.count, drawRange.start + drawRange.count);\n for (j = start, jl = end; j < jl; j += 3) {\n a = j;\n b = j + 1;\n c = j + 2;\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else {\n start = Math.max(0, drawRange.start);\n end = Math.min(positionAttribute.count, drawRange.start + drawRange.count);\n for (i = start, il = end; i < il; i += 3) {\n a = i;\n b = i + 1;\n c = i + 2;\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n }\n const morphedPositionAttribute = new Float32BufferAttribute(modifiedPosition, 3);\n const morphedNormalAttribute = new Float32BufferAttribute(modifiedNormal, 3);\n return {\n positionAttribute,\n normalAttribute,\n morphedPositionAttribute,\n morphedNormalAttribute\n };\n}\nfunction toCreasedNormals(geometry, creaseAngle = Math.PI / 3) {\n const creaseDot = Math.cos(creaseAngle);\n const hashMultiplier = (1 + 1e-10) * 100;\n const verts = [new Vector3(), new Vector3(), new Vector3()];\n const tempVec1 = new Vector3();\n const tempVec2 = new Vector3();\n const tempNorm = new Vector3();\n const tempNorm2 = new Vector3();\n function hashVertex(v) {\n const x = ~~(v.x * hashMultiplier);\n const y = ~~(v.y * hashMultiplier);\n const z = ~~(v.z * hashMultiplier);\n return `${x},${y},${z}`;\n }\n const resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;\n const posAttr = resultGeometry.attributes.position;\n const vertexMap = {};\n for (let i = 0, l = posAttr.count / 3; i < l; i++) {\n const i3 = 3 * i;\n const a = verts[0].fromBufferAttribute(posAttr, i3 + 0);\n const b = verts[1].fromBufferAttribute(posAttr, i3 + 1);\n const c = verts[2].fromBufferAttribute(posAttr, i3 + 2);\n tempVec1.subVectors(c, b);\n tempVec2.subVectors(a, b);\n const normal = new Vector3().crossVectors(tempVec1, tempVec2).normalize();\n for (let n = 0; n < 3; n++) {\n const vert = verts[n];\n const hash = hashVertex(vert);\n if (!(hash in vertexMap)) {\n vertexMap[hash] = [];\n }\n vertexMap[hash].push(normal);\n }\n }\n const normalArray = new Float32Array(posAttr.count * 3);\n const normAttr = new BufferAttribute(normalArray, 3, false);\n for (let i = 0, l = posAttr.count / 3; i < l; i++) {\n const i3 = 3 * i;\n const a = verts[0].fromBufferAttribute(posAttr, i3 + 0);\n const b = verts[1].fromBufferAttribute(posAttr, i3 + 1);\n const c = verts[2].fromBufferAttribute(posAttr, i3 + 2);\n tempVec1.subVectors(c, b);\n tempVec2.subVectors(a, b);\n tempNorm.crossVectors(tempVec1, tempVec2).normalize();\n for (let n = 0; n < 3; n++) {\n const vert = verts[n];\n const hash = hashVertex(vert);\n const otherNormals = vertexMap[hash];\n tempNorm2.set(0, 0, 0);\n for (let k = 0, lk = otherNormals.length; k < lk; k++) {\n const otherNorm = otherNormals[k];\n if (tempNorm.dot(otherNorm) > creaseDot) {\n tempNorm2.add(otherNorm);\n }\n }\n tempNorm2.normalize();\n normAttr.setXYZ(i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z);\n }\n }\n resultGeometry.setAttribute(\"normal\", normAttr);\n return resultGeometry;\n}\nexport {\n computeMorphedAttributes,\n estimateBytesUsed,\n interleaveAttributes,\n mergeBufferAttributes,\n mergeBufferGeometries,\n mergeVertices,\n toCreasedNormals,\n toTrianglesDrawMode\n};\n//# sourceMappingURL=BufferGeometryUtils.js.map\n","#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 { useMemo } from \"react\";\nimport transmission_pars_fragment from \"./shaders/transmission_pars_fragment.glsl\";\nimport transmission_fragment from \"./shaders/transmission_fragment.glsl\";\nimport { WOBBLE3D_PARAMS } from \".\";\nimport { MaterialProps } from \"../../types\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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\n/** You also need to rewrite the vertext shader of depthMaterial */\nconst rewriteVertex = (vertex: string) => {\n let shader = vertex;\n shader = shader.replace(\n \"#include \",\n `\n\t\tvec3 objectNormal = usf_Normal;\n\t\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t\t#endif`\n );\n // position\n shader = shader.replace(\n \"#include \",\n `\n\t\tvec3 transformed = usf_Position;`\n );\n\n // uniforms\n shader = shader.replace(\n \"void main() {\",\n `\n\t\tuniform float uTime;\n\t\tuniform float uWobblePositionFrequency;\n\t\tuniform float uWobbleTimeFrequency;\n\t\tuniform float uWobbleStrength;\n\t\tuniform float uWarpPositionFrequency;\n\t\tuniform float uWarpTimeFrequency;\n\t\tuniform float uWarpStrength;\n\t\tattribute vec4 tangent;\n\t\tvarying float vWobble;\n\t\tvarying vec2 vPosition;\n\t\t// edge\n\t\tvarying vec3 vEdgeNormal;\n\t\tvarying vec3 vEdgeViewPosition;\n\t\t#usf \n\t\tvoid main() {\n\t\t`\n );\n\n // vert\n shader = shader.replace(\n \"void main() {\",\n `\n\t\tvoid main() {\n\t\tvec3 usf_Position = position;\n\t\tvec3 usf_Normal = normal;\n\t\tvec3 biTangent = cross(normal, tangent.xyz);\n\t\t\n\t\t// Neighbours positions\n\t\tfloat shift = 0.01;\n\t\tvec3 positionA = usf_Position + tangent.xyz * shift;\n\t\tvec3 positionB = usf_Position + biTangent * shift;\n\t\t\n\t\t// wobble\n\t\tfloat wobble = (uWobbleStrength > 0.) ? getWobble(usf_Position) : 0.0;\n\t\tfloat wobblePositionA = (uWobbleStrength > 0.) ? getWobble(positionA) : 0.0;\n\t\tfloat wobblePositionB = (uWobbleStrength > 0.) ? getWobble(positionB) : 0.0;\n\t\t\n\t\tusf_Position += wobble * normal;\n\t\tpositionA += wobblePositionA * normal;\n\t\tpositionB += wobblePositionB * normal;\n\n\t\t// Compute normal\n\t\tvec3 toA = normalize(positionA - usf_Position);\n\t\tvec3 toB = normalize(positionB - usf_Position);\n\t\tusf_Normal = cross(toA, toB);\n\t\t\n\t\t// Varying\n\t\tvPosition = usf_Position.xy;\n\t\tvWobble = wobble/uWobbleStrength;\n\t\t\n\t\tvEdgeNormal = normalize(normalMatrix * usf_Normal);\n\t\tvec4 viewPosition = viewMatrix * modelMatrix * vec4(usf_Position, 1.0);\n\t\tvEdgeViewPosition = normalize(viewPosition.xyz);\n\t\t`\n );\n return shader;\n};\n\nexport type WobbleMaterialConstructor = new (opts: {\n [key: string]: any;\n}) => THREE.Material;\ntype WobbleMaterialParams =\n ConstructorParameters[0];\nexport interface WobbleMaterialProps\n extends MaterialProps {\n /** default:THREE.MeshPhysicalMaterial */\n baseMaterial?: T;\n materialParameters?: WobbleMaterialParams;\n /**\n * An optional callback that is executed immediately before the depth shader program is compiled.\n * @param shader — Source code of the shader\n * @param renderer — WebGLRenderer Context that is initializing the material\n */\n depthOnBeforeCompile?: (\n shader: THREE.WebGLProgramParametersWithUniforms,\n renderer: THREE.WebGLRenderer\n ) => 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 onBeforeCompile,\n depthOnBeforeCompile,\n isCustomTransmission = false,\n uniforms,\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 ...uniforms,\n },\n });\n\n mat.onBeforeCompile = (shader, renderer) => {\n Object.assign(shader.uniforms, mat.userData.uniforms);\n\n /********************\n\t\t\tvert\n\t\t\t********************/\n shader.vertexShader = rewriteVertex(shader.vertexShader);\n\n /********************\n\t\t\tfrag\n\t\t\t********************/\n // diffuse color , Manipulate color mixing ratio with `uColorMix`\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `\n\t\t\t\t\t#include \n\n\t\t\t\t\tif (uEdgeThreshold > 0.0) {\n\t\t\t\t\t\tfloat edgeThreshold = dot(vEdgeNormal, -vEdgeViewPosition);\n\t\t\t\t\t\tdiffuseColor = edgeThreshold < uEdgeThreshold ? vec4(uEdgeColor, 1.0) : mix(diffuseColor, usf_DiffuseColor, uColorMix);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdiffuseColor = mix(diffuseColor, usf_DiffuseColor, uColorMix);\n\t\t\t\t\t}\n\t\t\t\t`\n );\n\n // frag\n shader.fragmentShader = shader.fragmentShader.replace(\n \"void main() {\",\n `\n\t\t\t\tuniform vec3 uColor0;\n\t\t\t\tuniform vec3 uColor1;\n\t\t\t\tuniform vec3 uColor2;\n\t\t\t\tuniform vec3 uColor3;\n\t\t\t\tuniform float uColorMix;\n\t\t\t\tuniform float uEdgeThreshold;\n\t\t\t\tuniform vec3 uEdgeColor;\n\t\t\t\t\n\t\t\t\t// transmission\n\t\t\t\tuniform float uChromaticAberration; \n\t\t\t\tuniform float uAnisotropicBlur; \n\t\t\t\tuniform float uTime;\n\t\t\t\tuniform float uDistortion;\n\t\t\t\tuniform float uDistortionScale;\n\t\t\t\tuniform float uTemporalDistortion;\n\t\t\t\tuniform float uRefractionSamples;\n\t\t\t\t\n\t\t\t\tfloat rand(float n){return fract(sin(n) * 43758.5453123);}\n\t\t\t\t#usf \n\n\t\t\t\tvarying float vWobble;\n\t\t\t\tvarying vec2 vPosition;\n\t\t\t\tvarying vec3 vEdgeNormal;\n\t\t\t\tvarying vec3 vEdgeViewPosition;\n\t\t\t\t\n\t\t\t\tvoid main(){\n\t\t\t\t\tvec4 usf_DiffuseColor = vec4(1.0);\n\t\t\t\t\tfloat colorWobbleMix = smoothstep(-1.,1.,vWobble);\n\t\t\t\t\tvec2 colorPosMix = vec2(smoothstep(-1.,1.,vPosition.x),smoothstep(-1.,1.,vPosition.y));\n\t\t\t\t\n\t\t\t\t\tusf_DiffuseColor.rgb = mix(mix(uColor0, uColor1, colorPosMix.x), mix(uColor2, uColor3, colorPosMix.y), colorWobbleMix);\n\t\t\t\t`\n );\n\n // custom transmission\n if (mat.type === \"MeshPhysicalMaterial\" && isCustomTransmission) {\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `${transmission_pars_fragment}`\n );\n\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `${transmission_fragment}`\n );\n }\n\n setOnBeforeCompile(onBeforeCompile)(shader, renderer);\n };\n mat.needsUpdate = true;\n\n /*===============================================\n\t\tdepthMaterial\n\t\t===============================================*/\n const depthMat = new THREE.MeshDepthMaterial({\n depthPacking: THREE.RGBADepthPacking,\n });\n depthMat.onBeforeCompile = (shader, renderer) => {\n Object.assign(shader.uniforms, mat.userData.uniforms);\n shader.vertexShader = rewriteVertex(shader.vertexShader);\n setOnBeforeCompile(depthOnBeforeCompile)(shader, renderer);\n };\n depthMat.needsUpdate = true;\n\n return { material: mat, depthMaterial: depthMat };\n }, [\n materialParameters,\n baseMaterial,\n onBeforeCompile,\n depthOnBeforeCompile,\n uniforms,\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 onBeforeCompile,\n depthOnBeforeCompile,\n uniforms,\n}: UseCreateWobble3DProps &\n Create3DHooksProps &\n WobbleMaterialProps): UseCreateWobble3DReturn => {\n const wobbleGeometry = useMemo(() => {\n let geo = geometry || new THREE.IcosahedronGeometry(2, 20);\n geo = mergeVertices(geo);\n geo.computeTangents();\n return geo;\n }, [geometry]);\n const { material, depthMaterial } = useMaterial({\n baseMaterial,\n materialParameters,\n onBeforeCompile,\n depthOnBeforeCompile,\n uniforms,\n isCustomTransmission,\n });\n\n const mesh = useAddObject(scene, wobbleGeometry, material, THREE.Mesh);\n\n const userData = material.userData as Wobble3DMaterial;\n const updateValue = setUniform(userData);\n const 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 isSizeUpdate,\n camera,\n geometry,\n baseMaterial,\n materialParameters,\n uniforms,\n onBeforeCompile,\n depthOnBeforeCompile,\n isCustomTransmission,\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 uniforms,\n onBeforeCompile,\n depthOnBeforeCompile,\n isCustomTransmission,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n });\n\n const updateFx = useCallback(\n (\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","export type EasingTypes =\n | \"easeInSine\"\n | \"easeOutSine\"\n | \"easeInOutSine\"\n | \"easeInQuad\"\n | \"easeOutQuad\"\n | \"easeInOutQuad\"\n | \"easeInCubic\"\n | \"easeOutCubic\"\n | \"easeInOutCubic\"\n | \"easeInQuart\"\n | \"easeOutQuart\"\n | \"easeInOutQuart\"\n | \"easeInQuint\"\n | \"easeOutQuint\"\n | \"easeInOutQuint\"\n | \"easeInExpo\"\n | \"easeOutExpo\"\n | \"easeInOutExpo\"\n | \"easeInCirc\"\n | \"easeOutCirc\"\n | \"easeInOutCirc\"\n | \"easeInBack\"\n | \"easeOutBack\"\n | \"easeInOutBack\"\n | \"easeInElastic\"\n | \"easeOutElastic\"\n | \"easeInOutElastic\"\n | \"easeInBounce\"\n | \"easeOutBounce\"\n | \"easeInOutBounce\";\n\ntype EasingFunctions = {\n [K in EasingTypes]: (x: number) => number;\n};\n\n/**\n * from https://github.com/ai/easings.net\n */\nexport const Easing: EasingFunctions = Object.freeze({\n easeInSine(x: number): number {\n return 1 - Math.cos((x * Math.PI) / 2);\n },\n easeOutSine(x: number): number {\n return Math.sin((x * Math.PI) / 2);\n },\n easeInOutSine(x: number): number {\n return -(Math.cos(Math.PI * x) - 1) / 2;\n },\n easeInQuad(x: number): number {\n return x * x;\n },\n easeOutQuad(x: number): number {\n return 1 - (1 - x) * (1 - x);\n },\n easeInOutQuad(x: number): number {\n return x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2;\n },\n easeInCubic(x: number): number {\n return x * x * x;\n },\n easeOutCubic(x: number): number {\n return 1 - Math.pow(1 - x, 3);\n },\n easeInOutCubic(x: number): number {\n return x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2;\n },\n easeInQuart(x: number): number {\n return x * x * x * x;\n },\n easeOutQuart(x: number): number {\n return 1 - Math.pow(1 - x, 4);\n },\n easeInOutQuart(x: number): number {\n return x < 0.5 ? 8 * x * x * x * x : 1 - Math.pow(-2 * x + 2, 4) / 2;\n },\n easeInQuint(x: number): number {\n return x * x * x * x * x;\n },\n easeOutQuint(x: number): number {\n return 1 - Math.pow(1 - x, 5);\n },\n easeInOutQuint(x: number): number {\n return x < 0.5 ? 16 * x * x * x * x * x : 1 - Math.pow(-2 * x + 2, 5) / 2;\n },\n easeInExpo(x: number): number {\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\n },\n easeOutExpo(x: number): number {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n },\n easeInOutExpo(x: number): number {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? Math.pow(2, 20 * x - 10) / 2\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\n },\n easeInCirc(x: number): number {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n },\n easeOutCirc(x: number): number {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n },\n easeInOutCirc(x: number): number {\n return x < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\n },\n easeInBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return c3 * x * x * x - c1 * x * x;\n },\n easeOutBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return 1 + c3 * Math.pow(x - 1, 3) + c1 * Math.pow(x - 1, 2);\n },\n easeInOutBack(x: number): number {\n const c1 = 1.70158;\n const c2 = c1 * 1.525;\n\n return x < 0.5\n ? (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2\n : (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2;\n },\n easeInElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\n },\n easeOutElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1;\n },\n easeInOutElastic(x: number): number {\n const c5 = (2 * Math.PI) / 4.5;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * c5)) / 2\n : (Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * c5)) / 2 +\n 1;\n },\n easeInBounce(x: number): number {\n return 1 - Easing.easeOutBounce(1 - x);\n },\n easeOutBounce(x: number): number {\n const n1 = 7.5625;\n const d1 = 2.75;\n\n if (x < 1 / d1) {\n return n1 * x * x;\n } else if (x < 2 / d1) {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n } else if (x < 2.5 / d1) {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n } else {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n },\n easeInOutBounce(x: number): number {\n return x < 0.5\n ? (1 - Easing.easeOutBounce(1 - 2 * x)) / 2\n : (1 + Easing.easeOutBounce(2 * x - 1)) / 2;\n },\n});\n","import * as THREE from \"three\";\nimport { Easing, EasingTypes } from \"../libs/easing\";\nimport { useCallback } from \"react\";\n\n/** Returns a unique hash specific to the beat */\nfunction getHash(input: number) {\n let n = Math.sin(input * 12.9898) * 43758.5453;\n return n - Math.floor(n);\n}\n\ntype BeatValues = {\n beat: number;\n floor: number;\n fract: number;\n /** unique hash specific to the beat */\n hash: number;\n};\n\n/**\n * @param ease easing functions are referenced from https://github.com/ai/easings.net , default : \"easeOutQuart\"\n */\nexport const useBeat = (bpm: number, ease: EasingTypes = \"easeOutQuart\") => {\n const rhythm = bpm / 60;\n const easing = Easing[ease];\n const updateBeat = useCallback(\n (clock: THREE.Clock) => {\n let beat = clock.getElapsedTime() * rhythm;\n const floor = Math.floor(beat);\n const fract = easing(beat - floor);\n beat = fract + floor;\n const hash = getHash(floor);\n return {\n beat,\n floor,\n fract,\n hash,\n } as BeatValues;\n },\n [rhythm, easing]\n );\n return updateBeat;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo, useRef } from \"react\";\n\n/**\n * @param fps FPS you want to limit , default : `60`\n *\n * ```tsx\n * const limiter = useFPSLimiter(fps);\n * useFrame((props) => {\n * if (limiter(props.clock)) {\n *\t\t //some code\n * }\n * });\n * ```\n */\nexport const useFPSLimiter = (fps: number = 60) => {\n const interval = useMemo(() => 1 / Math.max(Math.min(fps, 60), 1), [fps]);\n const prevTime = useRef(null);\n\n const limiter = useCallback(\n (clock: THREE.Clock) => {\n const tick = clock.getElapsedTime();\n if (prevTime.current === null) {\n prevTime.current = tick;\n return true;\n }\n const deltaTime = tick - prevTime.current;\n if (deltaTime >= interval) {\n prevTime.current = tick;\n return true;\n }\n return false;\n },\n [interval]\n );\n\n return limiter;\n};\n","import { DomSyncerParams } from \"..\";\n\nexport const errorHandler = (params: DomSyncerParams) => {\n const domLength = params.dom?.length;\n const textureLength = params.texture?.length;\n\n if (!domLength || !textureLength) {\n return true;\n }\n\n if (domLength !== textureLength) {\n return true;\n }\n\n return false;\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec2 u_textureResolution;\nuniform vec2 u_resolution;\nuniform float u_borderRadius;\n\nvoid main() {\n\t// texuture color\n\tfloat screenAspect = u_resolution.x / u_resolution.y;\n\tfloat textureAspect = u_textureResolution.x / u_textureResolution.y;\n\tvec2 ratio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\n\tvec2 adjustedUv = vUv * ratio + (1.0 - ratio) * 0.5;\n\tvec3 textureColor = texture2D(u_texture, adjustedUv).rgb;\n\tfloat textureAlpha = texture2D(u_texture, adjustedUv).a;\n\n\t// Based on https://mofu-dev.com/en/blog/three-dom-alignment/\n\tfloat maxSide = max(u_resolution.x, u_resolution.y);\n\tfloat minSide = min(u_resolution.x, u_resolution.y);\n\tvec2 aspect = u_resolution / maxSide;\n\tvec2 alphaUv = vUv - 0.5;\n\n\tfloat borderRadius = min(u_borderRadius, minSide * 0.5);\n\tvec2 offset = vec2(borderRadius) / u_resolution;\n\tvec2 alphaXY = smoothstep(vec2(0.5 - offset), vec2(0.5 - offset - 0.001), abs(alphaUv));\n\tfloat alpha = min(1.0, alphaXY.x + alphaXY.y);\n\n\tvec2 alphaUv2 = abs(vUv - 0.5);\n\tfloat radius = borderRadius / maxSide;\n\talphaUv2 = (alphaUv2 - 0.5) * aspect + radius;\n\tfloat roundAlpha = smoothstep(radius + 0.001, radius, length(alphaUv2));\n\n\talpha = min(1.0, alpha + roundAlpha);\n\n\t// multiply texture alpha\n\talpha *= textureAlpha;\n\n\tgl_FragColor = vec4(textureColor, alpha);\n}\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"../\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"../shader/main.vert\";\nimport fragmentShader from \"../shader/main.frag\";\nimport { MaterialProps } from \"../../../fxs/types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../libs/constants\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n params: DomSyncerParams;\n size: Size;\n scene: THREE.Scene;\n} & MaterialProps) => {\n if (scene.children.length > 0) {\n scene.children.forEach((child) => {\n if (child instanceof THREE.Mesh) {\n child.geometry.dispose();\n child.material.dispose();\n }\n });\n scene.remove(...scene.children);\n }\n\n params.texture!.forEach((texture, i) => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: texture },\n u_textureResolution: {\n value: new THREE.Vector2(0, 0),\n },\n u_resolution: { value: new THREE.Vector2(0, 0) },\n u_borderRadius: {\n value: params.boderRadius![i] ? params.boderRadius![i] : 0.0,\n },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent.\n transparent: true,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n const mesh = new THREE.Mesh(new THREE.PlaneGeometry(1, 1), mat);\n scene.add(mesh);\n });\n};\n","import { useCallback, useRef } from \"react\";\nimport { DomSyncerParams } from \"..\";\n\nexport const useIntersectionHandler = () => {\n const intersectionObserverRef = useRef([]);\n const intersectionDomRef = useRef<(HTMLElement | Element | null)[]>([]);\n\n const intersectionHandler = useCallback(\n ({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n }: {\n isIntersectingRef: React.MutableRefObject;\n isIntersectingOnceRef: React.MutableRefObject;\n params: DomSyncerParams;\n }) => {\n if (intersectionObserverRef.current.length > 0) {\n intersectionObserverRef.current.forEach((observer, i) => {\n observer.unobserve(intersectionDomRef.current[i]!);\n });\n }\n\n intersectionDomRef.current = [];\n intersectionObserverRef.current = [];\n\n const newArr = new Array(params.dom!.length).fill(false);\n isIntersectingRef.current = [...newArr];\n isIntersectingOnceRef.current = [...newArr];\n\n params.dom!.forEach((dom, i) => {\n const callback = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n params.onIntersect![i] && params.onIntersect![i](entry);\n // Update the judgment after execution so that the judgment of isIntersectin can be used when executing onIntersect\n isIntersectingRef.current[i] = entry.isIntersecting;\n });\n };\n const observer = new IntersectionObserver(callback, {\n rootMargin: \"0px\",\n threshold: 0,\n });\n observer.observe(dom!);\n intersectionObserverRef.current.push(observer);\n intersectionDomRef.current.push(dom!);\n });\n },\n []\n );\n\n return intersectionHandler;\n};\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"..\";\nimport { Size } from \"@react-three/fiber\";\nimport {\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, samples, isSizeUpdate, uniforms, onBeforeCompile }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n const [params, setParams] = useParams({\n ...DOMSYNCER_PARAMS,\n updateKey: performance.now(),\n });\n\n const [DOMRects, updateDomRects] = useUpdateDomRect();\n\n // Avoid instancing vec2 every frame\n const resolutionRef = useRef(new THREE.Vector2(0, 0));\n\n // Update monitored doms according to the dependency array\n const [refreshTrigger, setRefreshTrigger] = useState(true);\n useMemo(\n () => setRefreshTrigger(true),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n dependencies\n );\n\n // If the dependencies have been updated but the key has not been updated, skip processing and return an empty texture\n const updateKey = useRef(null);\n const emptyTexture = useMemo(() => 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 uniforms,\n onBeforeCompile,\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 uniforms,\n intersectionHandler,\n onBeforeCompile,\n refreshTrigger,\n scene,\n params,\n isIntersectingOnceRef,\n isIntersectingRef,\n emptyTexture,\n updateParams,\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 { UseFboProps, renderFBO, FBO_OPTION } from \"../utils/useSingleFBO\";\n\ntype UpdateCopyFunction = (\n gl: THREE.WebGLRenderer,\n index: number,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseCopyTextureReturn = [THREE.WebGLRenderTarget[], UpdateCopyFunction];\n\n/**\n * Generate an FBO array to copy the texture.\n * @param dpr If dpr is set, dpr will be multiplied, default : `false`\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false`\n * @param length The number of FBOs to create\n * @returns [THREE.WebGLRenderTarget[] , updateCopyTexture] - Receives the RenderTarget array as the first argument and the update function as the second argument. `updateCopyTexture()` receives gl as the first argument and the index of the texture you want to copy as the second argument.\n */\nexport const useCopyTexture = (\n {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n }: UseFboProps,\n length: number\n): UseCopyTextureReturn => {\n const renderTargetArr = useRef([]);\n const resolution = useResolution(size, dpr);\n\n renderTargetArr.current = useMemo(() => {\n return Array.from({ length }, () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [length]);\n\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","setUniform","material","key","value","uniforms","setCustomUniform","customParams","useAddObject","scene","geometry","Proto","object3D","obj","useEffect","ISDEV","MATERIAL_BASIC_PARAMS","DEFAULT_TEXTURE","wobble3D_default","snoise_default","coverTexture_default","fxBlending_default","planeVert_default","SHADER_CHUNK","wobble3D","snoise","coverTexture","fxBlending","planeVert","includePattern","includeReplacer","match","include","string","resolveIncludes","resolveShaders","parameters","setOnBeforeCompile","onBeforeCompile","renderer","useMesh","mat","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_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","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","iterations","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","mergeVertices","tolerance","hashToIndex","indices","vertexCount","nextIndex","attributeNames","attrArrays","morphAttrsArrays","newIndices","getters","l","name","morphAttr","decimalShift","shiftMultiplier","hash","k","newarray","newMorphArrays","getterFunc","m","ml","result","oldAttribute","buffer","BufferAttribute","oldMorphAttribute","buffer2","morphAttribute","transmission_pars_fragment_default","transmission_fragment_default","rewriteVertex","vertex","shader","baseMaterial","materialParameters","depthOnBeforeCompile","isCustomTransmission","depthMaterial","WOBBLE3D_PARAMS","transmission_pars_fragment","transmission_fragment","depthMat","useCreateWobble3D","wobbleGeometry","userData","useWobble3D","RootState","useAddMesh","Easing","x","c2","c4","c5","getHash","input","useBeat","bpm","ease","rhythm","easing","beat","floor","fract","useFPSLimiter","fps","interval","prevTime","tick","errorHandler","domLength","textureLength","createMesh","child","useIntersectionHandler","intersectionObserverRef","intersectionDomRef","isIntersectingRef","isIntersectingOnceRef","observer","newArr","dom","callback","entries","entry","useUpdateDomRect","domRects","updateDomRects","resolutionRef","domElement","rect","useIsIntersecting","isIntersecting","once","createUseDomView","onView","onHidden","isView","id","filterIntersection","item","DOMSYNCER_PARAMS","useDomSyncer","dependencies","DOMRects","refreshTrigger","setRefreshTrigger","useState","updateKey","emptyTexture","intersectionHandler","useDomView","useCopyTexture","length","renderTargetArr","updateCopyTexture"],"mappings":"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","x_google_ignoreList":[123]} \ 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 fe1457a8..fd4e63d0 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.27", + "version": "1.1.28", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@funtech-inc/use-shader-fx", - "version": "1.1.27", + "version": "1.1.28", "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 e25f0ee2..e8f05194 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.27", + "version": "1.1.28", "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/useWobble3D/useMaterial.ts b/packages/use-shader-fx/src/fxs/3D/useWobble3D/useMaterial.ts index 0bc37b37..136ec6ac 100644 --- a/packages/use-shader-fx/src/fxs/3D/useWobble3D/useMaterial.ts +++ b/packages/use-shader-fx/src/fxs/3D/useWobble3D/useMaterial.ts @@ -127,7 +127,7 @@ export interface WobbleMaterialProps * @param renderer — WebGLRenderer Context that is initializing the material */ depthOnBeforeCompile?: ( - shader: THREE.Shader, + shader: THREE.WebGLProgramParametersWithUniforms, renderer: THREE.WebGLRenderer ) => void; /** diff --git a/packages/use-shader-fx/src/fxs/types/index.ts b/packages/use-shader-fx/src/fxs/types/index.ts index c8eeb7f3..e4f12740 100644 --- a/packages/use-shader-fx/src/fxs/types/index.ts +++ b/packages/use-shader-fx/src/fxs/types/index.ts @@ -17,11 +17,11 @@ export type MaterialProps = { }; /** * An optional callback that is executed immediately before the shader program is compiled. `use-shader-fx` already defines `onBeforeCompile`, so pass the function to this props instead of redefining it in material. - * @param shader — Source code of the shader + * @param parameters — WebGL program parameters * @param renderer — WebGLRenderer Context that is initializing the material */ onBeforeCompile?: ( - shader: THREE.Shader, + parameters: THREE.WebGLProgramParametersWithUniforms, renderer: THREE.WebGLRenderer ) => void; }; diff --git a/packages/use-shader-fx/src/libs/shaders/resolveShaders.ts b/packages/use-shader-fx/src/libs/shaders/resolveShaders.ts index 70913309..2348758f 100644 --- a/packages/use-shader-fx/src/libs/shaders/resolveShaders.ts +++ b/packages/use-shader-fx/src/libs/shaders/resolveShaders.ts @@ -25,7 +25,9 @@ function resolveIncludes(string: string) { return string.replace(includePattern, includeReplacer); } -export const resolveShaders = (shader: THREE.Shader) => { - shader.vertexShader = resolveIncludes(shader.vertexShader); - shader.fragmentShader = resolveIncludes(shader.fragmentShader); +export const resolveShaders = ( + parameters: THREE.WebGLProgramParametersWithUniforms +) => { + parameters.vertexShader = resolveIncludes(parameters.vertexShader); + parameters.fragmentShader = resolveIncludes(parameters.fragmentShader); }; diff --git a/packages/use-shader-fx/src/utils/setOnBeforeCompile.ts b/packages/use-shader-fx/src/utils/setOnBeforeCompile.ts index 466d6495..6ed612ce 100644 --- a/packages/use-shader-fx/src/utils/setOnBeforeCompile.ts +++ b/packages/use-shader-fx/src/utils/setOnBeforeCompile.ts @@ -1,15 +1,16 @@ +import * as THREE from "three"; import { resolveShaders } from "../libs/shaders/resolveShaders"; type OnBeforeCompile = ( - shader: THREE.Shader, + parameters: THREE.WebGLProgramParametersWithUniforms, renderer: THREE.WebGLRenderer ) => void; export const setOnBeforeCompile = ( onBeforeCompile?: OnBeforeCompile ): OnBeforeCompile => { - return (shader, renderer) => { - onBeforeCompile && onBeforeCompile(shader, renderer); - resolveShaders(shader); + return (parameters, renderer) => { + onBeforeCompile && onBeforeCompile(parameters, renderer); + resolveShaders(parameters); }; }; diff --git a/packages/use-shader-fx/src/utils/setUniforms.ts b/packages/use-shader-fx/src/utils/setUniforms.ts index a058c273..23c30d2e 100644 --- a/packages/use-shader-fx/src/utils/setUniforms.ts +++ b/packages/use-shader-fx/src/utils/setUniforms.ts @@ -1,3 +1,4 @@ +import * as THREE from "three"; type UniformValue = | THREE.CubeTexture | THREE.Texture diff --git a/packages/use-shader-fx/types/fxs/3D/types/index.d.ts b/packages/use-shader-fx/types/fxs/3D/types/index.d.ts new file mode 100644 index 00000000..1af2ca28 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/3D/types/index.d.ts @@ -0,0 +1,10 @@ +import * as THREE from "three"; +import { HooksProps, MaterialProps } from "../../types"; +export interface HooksProps3D extends HooksProps { + /** For 3D series, you should use the r3f camera as it is as the camera passed to renderTarget. */ + camera: THREE.Camera; +} +export interface Create3DHooksProps extends MaterialProps { + /** You can put the r3f scene in, or if you don't want to add to any scene, you can pass nothing and it will just return the object without putting it in the scene, default : `false` */ + scene?: THREE.Scene | false; +} diff --git a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/index.d.ts b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/index.d.ts new file mode 100644 index 00000000..06f23ec3 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/index.d.ts @@ -0,0 +1,66 @@ +import * as THREE from "three"; +import { HooksReturn } from "../../types"; +import { UseCreateMorphParticlesProps } from "./useCreateMorphParticles"; +import { HooksProps3D } from "../types"; +import { InteractiveMesh, MorphParticlePoints } from "./utils/useCreateObject"; +import { CustomParams } from "../../../utils/setUniforms"; +export type MorphParticlesParams = { + /** progress value to morph vertices,0~1 */ + morphProgress?: number; + blurAlpha?: number; + blurRadius?: number; + pointSize?: number; + /** default : `1` */ + pointAlpha?: number; + /** Since the color is extracted based on the attribute `uv`, the intended behavior will not occur if there is no uv in the attribute. */ + picture?: THREE.Texture | false; + /** The alpha map is a grayscale texture that controls the opacity across the surface (black: fully transparent; white: fully opaque). use the green channel when sampling this texture. It also affects the size of the point. default : `false` */ + alphaPicture?: THREE.Texture | false; + color0?: THREE.Color; + color1?: THREE.Color; + color2?: THREE.Color; + color3?: THREE.Color; + /** This maps to point,texture */ + map?: THREE.Texture | false; + /** The alpha map is a grayscale texture that controls the opacity across the surface (black: fully transparent; white: fully opaque). use the green channel when sampling this texture. default : `false` */ + alphaMap?: THREE.Texture | false; + /** If ​​wobbleStrength is set to 0, wobble will stop. It will also affect noise calculation, default : `0` */ + wobbleStrength?: number; + wobblePositionFrequency?: number; + wobbleTimeFrequency?: number; + /** default : `0` */ + warpStrength?: number; + warpPositionFrequency?: number; + warpTimeFrequency?: number; + /** Manipulate the vertices using the color channels of this texture. The strength of the displacement changes depending on the g channel of this texture */ + displacement?: THREE.Texture | false; + /** Strength of displacement. The strength of displacement depends on g ch, but is the value multiplied by it , default : `1` */ + displacementIntensity?: number; + /** Strength to reflect color ch of displacement texture */ + displacementColorIntensity?: number; + /** If set to 0, noise calculation stops, default : `0` */ + sizeRandomIntensity?: number; + sizeRandomTimeFrequency?: number; + sizeRandomMin?: number; + sizeRandomMax?: number; + /** Divergence rate of a point. Negative cases are dense, positive cases are divergent, default : `0` */ + divergence?: number; + /** Divergence centre point, default : `THREE.Vector3(0)` */ + divergencePoint?: THREE.Vector3; + /** you can get into the rhythm ♪ , default : `false` */ + beat?: number | false; +}; +export type MorphParticlesObject = { + scene: THREE.Scene; + points: MorphParticlePoints; + interactiveMesh: InteractiveMesh; + renderTarget: THREE.WebGLRenderTarget; + output: THREE.Texture; + positions: Float32Array[]; + uvs: Float32Array[]; +}; +export declare const MORPHPARTICLES_PARAMS: MorphParticlesParams; +/** + * @link https://github.com/FunTechInc/use-shader-fx + */ +export declare const useMorphParticles: ({ size, dpr, samples, isSizeUpdate, camera, geometry, positions, uvs, uniforms, onBeforeCompile, }: HooksProps3D & UseCreateMorphParticlesProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/useCreateMorphParticles.d.ts b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/useCreateMorphParticles.d.ts new file mode 100644 index 00000000..4bdce8c4 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/useCreateMorphParticles.d.ts @@ -0,0 +1,29 @@ +import * as THREE from "three"; +import { Size, RootState } from "@react-three/fiber"; +import { InteractiveMesh, MorphParticlePoints } from "./utils/useCreateObject"; +import { MorphParticlesParams } from "."; +import { CustomParams } from "../../../utils/setUniforms"; +import { Create3DHooksProps } from "../types"; +import { Dpr } from "../../types"; +export type UseCreateMorphParticlesProps = { + size: Size; + dpr: Dpr; + /** default : `THREE.SphereGeometry(1, 32, 32)` */ + geometry?: THREE.BufferGeometry; + positions?: Float32Array[]; + uvs?: Float32Array[]; + /** Array of textures to map to points. Mapped at random. */ + mapArray?: THREE.Texture[]; +}; +type UpdateUniform = (rootState: RootState | null, newParams?: MorphParticlesParams, customParams?: CustomParams) => void; +type UseCreateMorphParticlesReturn = [ + UpdateUniform, + { + points: MorphParticlePoints; + interactiveMesh: InteractiveMesh; + positions: Float32Array[]; + uvs: Float32Array[]; + } +]; +export declare const useCreateMorphParticles: ({ size, dpr, scene, geometry, positions, uvs, mapArray, uniforms, onBeforeCompile, }: Create3DHooksProps & UseCreateMorphParticlesProps) => UseCreateMorphParticlesReturn; +export {}; diff --git a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/modifyAttributes.d.ts b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/modifyAttributes.d.ts new file mode 100644 index 00000000..241902bc --- /dev/null +++ b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/modifyAttributes.d.ts @@ -0,0 +1,5 @@ +import * as THREE from "three"; +/** + * 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 + * */ +export declare const modifyAttributes: (attribute: Float32Array[] | undefined, targetGeometry: THREE.BufferGeometry, targetAttibute: "position" | "uv", itemSize: number) => Float32Array[]; diff --git a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/rewriteFragmentShader.d.ts b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/rewriteFragmentShader.d.ts new file mode 100644 index 00000000..c46d824e --- /dev/null +++ b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/rewriteFragmentShader.d.ts @@ -0,0 +1,5 @@ +import * as THREE from "three"; +export declare const rewriteFragmentShader: (mapArray: THREE.Texture[] | undefined, fragmentShader: string) => { + rewritedFragmentShader: string; + mapArrayUniforms: any; +}; diff --git a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/rewriteVertexShader.d.ts b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/rewriteVertexShader.d.ts new file mode 100644 index 00000000..90866e6c --- /dev/null +++ b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/rewriteVertexShader.d.ts @@ -0,0 +1,2 @@ +import * as THREE from "three"; +export declare const rewriteVertexShader: (modifeidAttributes: Float32Array[], targetGeometry: THREE.BufferGeometry, targetAttibute: "position" | "uv", vertexShader: string, itemSize: number) => string; diff --git a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/useCreateObject.d.ts b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/useCreateObject.d.ts new file mode 100644 index 00000000..b3ff18d9 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/useCreateObject.d.ts @@ -0,0 +1,13 @@ +import * as THREE from "three"; +type UseCreateObjectProps = { + scene: THREE.Scene | false; + geometry: THREE.BufferGeometry; + material: THREE.ShaderMaterial; +}; +export type MorphParticlePoints = THREE.Points, THREE.ShaderMaterial>; +export type InteractiveMesh = THREE.Mesh, THREE.ShaderMaterial>; +export declare const useCreateObject: ({ scene, geometry, material, }: UseCreateObjectProps) => { + points: MorphParticlePoints; + interactiveMesh: InteractiveMesh; +}; +export {}; diff --git a/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/useMaterial.d.ts b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/useMaterial.d.ts new file mode 100644 index 00000000..95b48142 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/3D/useMorphParticles/utils/useMaterial.d.ts @@ -0,0 +1,124 @@ +import * as THREE from "three"; +import { Size } from "@react-three/fiber"; +import { MaterialProps } from "../../../types"; +export declare class MorphParticlesMaterial extends THREE.ShaderMaterial { + uniforms: { + uResolution: { + value: THREE.Vector2; + }; + uMorphProgress: { + value: number; + }; + uBlurAlpha: { + value: number; + }; + uBlurRadius: { + value: number; + }; + uPointSize: { + value: number; + }; + uPointAlpha: { + value: number; + }; + uPicture: { + value: THREE.Texture; + }; + uIsPicture: { + value: boolean; + }; + uAlphaPicture: { + value: THREE.Texture; + }; + uIsAlphaPicture: { + value: boolean; + }; + uColor0: { + value: THREE.Color; + }; + uColor1: { + value: THREE.Color; + }; + uColor2: { + value: THREE.Color; + }; + uColor3: { + value: THREE.Color; + }; + uMap: { + value: THREE.Texture; + }; + uIsMap: { + value: boolean; + }; + uAlphaMap: { + value: THREE.Texture; + }; + uIsAlphaMap: { + value: boolean; + }; + uTime: { + value: number; + }; + uWobblePositionFrequency: { + value: number; + }; + uWobbleTimeFrequency: { + value: number; + }; + uWobbleStrength: { + value: number; + }; + uWarpPositionFrequency: { + value: number; + }; + uWarpTimeFrequency: { + value: number; + }; + uWarpStrength: { + value: number; + }; + uDisplacement: { + value: THREE.Texture; + }; + uIsDisplacement: { + value: boolean; + }; + uDisplacementIntensity: { + value: number; + }; + uDisplacementColorIntensity: { + value: number; + }; + uSizeRandomIntensity: { + value: number; + }; + uSizeRandomTimeFrequency: { + value: number; + }; + uSizeRandomMin: { + value: number; + }; + uSizeRandomMax: { + value: number; + }; + uDivergence: { + value: number; + }; + uDivergencePoint: { + value: THREE.Vector3; + }; + }; +} +export declare const useMaterial: ({ size, dpr, geometry, positions, uvs, mapArray, uniforms, onBeforeCompile, }: { + size: Size; + dpr: number | false; + geometry: THREE.BufferGeometry; + positions?: Float32Array[] | undefined; + uvs?: Float32Array[] | undefined; + mapArray?: THREE.Texture[] | undefined; +} & MaterialProps) => { + material: MorphParticlesMaterial; + modifiedPositions: Float32Array[]; + modifiedUvs: Float32Array[]; +}; diff --git a/packages/use-shader-fx/types/fxs/3D/useWobble3D/index.d.ts b/packages/use-shader-fx/types/fxs/3D/useWobble3D/index.d.ts new file mode 100644 index 00000000..d8095058 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/3D/useWobble3D/index.d.ts @@ -0,0 +1,56 @@ +import * as THREE from "three"; +import { HooksReturn } from "../../types"; +import { UseCreateWobble3DProps } from "./useCreateWobble3D"; +import { WobbleMaterialProps, WobbleMaterialConstructor } from "./useMaterial"; +import { HooksProps3D } from "../types"; +import { CustomParams } from "../../../utils/setUniforms"; +export type Wobble3DParams = { + /** default : `0.3` */ + wobbleStrength?: number; + /** default : `0.3` */ + wobblePositionFrequency?: number; + /** default : `0.3` */ + wobbleTimeFrequency?: number; + /** default : `0.3` */ + warpStrength?: number; + /** default : `0.3` */ + warpPositionFrequency?: number; + /** default : `0.3` */ + warpTimeFrequency?: number; + color0?: THREE.Color; + color1?: THREE.Color; + color2?: THREE.Color; + color3?: THREE.Color; + /** Mixing ratio with the material's original output color, 0~1 , defaulat : `1` */ + colorMix?: number; + /** Threshold of edge. 0 for edge disabled, default : `0` */ + edgeThreshold?: number; + /** Color of edge. default : `0x000000` */ + edgeColor?: THREE.Color; + /** you can get into the rhythm ♪ , default : `false` */ + beat?: number | false; + /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.1` */ + chromaticAberration?: number; + /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.1` */ + anisotropicBlur?: number; + /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.0` */ + distortion?: number; + /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.1` */ + distortionScale?: number; + /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `0.0` */ + temporalDistortion?: number; + /** valid only for `MeshPhysicalMaterial` && `isCustomTransmission:true` , default : `6` */ + refractionSamples?: number; +}; +export type Wobble3DObject = { + scene: THREE.Scene; + mesh: THREE.Mesh; + depthMaterial: THREE.MeshDepthMaterial; + renderTarget: THREE.WebGLRenderTarget; + output: THREE.Texture; +}; +export declare const WOBBLE3D_PARAMS: Wobble3DParams; +/** + * @link https://github.com/FunTechInc/use-shader-fx + */ +export declare const useWobble3D: ({ size, dpr, samples, isSizeUpdate, camera, geometry, baseMaterial, materialParameters, uniforms, onBeforeCompile, depthOnBeforeCompile, isCustomTransmission, }: HooksProps3D & UseCreateWobble3DProps & WobbleMaterialProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/3D/useWobble3D/useCreateWobble3D.d.ts b/packages/use-shader-fx/types/fxs/3D/useWobble3D/useCreateWobble3D.d.ts new file mode 100644 index 00000000..532af3e2 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/3D/useWobble3D/useCreateWobble3D.d.ts @@ -0,0 +1,20 @@ +import * as THREE from "three"; +import { RootState } from "@react-three/fiber"; +import { WobbleMaterialProps, WobbleMaterialConstructor } from "./useMaterial"; +import { Wobble3DParams } from "."; +import { CustomParams } from "../../../utils/setUniforms"; +import { Create3DHooksProps } from "../types"; +export type UseCreateWobble3DProps = { + /** default : `THREE.IcosahedronGeometry(2,20)` */ + geometry?: THREE.BufferGeometry; +}; +type UpdateUniform = (rootState: RootState | null, newParams?: Wobble3DParams, customParams?: CustomParams) => void; +type UseCreateWobble3DReturn = [ + UpdateUniform, + { + mesh: THREE.Mesh; + depthMaterial: THREE.MeshDepthMaterial; + } +]; +export declare const useCreateWobble3D: ({ scene, geometry, isCustomTransmission, baseMaterial, materialParameters, onBeforeCompile, depthOnBeforeCompile, uniforms, }: UseCreateWobble3DProps & Create3DHooksProps & WobbleMaterialProps) => UseCreateWobble3DReturn; +export {}; diff --git a/packages/use-shader-fx/types/fxs/3D/useWobble3D/useMaterial.d.ts b/packages/use-shader-fx/types/fxs/3D/useWobble3D/useMaterial.d.ts new file mode 100644 index 00000000..f19dad9e --- /dev/null +++ b/packages/use-shader-fx/types/fxs/3D/useWobble3D/useMaterial.d.ts @@ -0,0 +1,91 @@ +import * as THREE from "three"; +import { MaterialProps } from "../../types"; +export declare class Wobble3DMaterial extends THREE.Material { + uniforms: { + uTime: { + value: number; + }; + uWobblePositionFrequency: { + value: number; + }; + uWobbleTimeFrequency: { + value: number; + }; + uWobbleStrength: { + value: number; + }; + uWarpPositionFrequency: { + value: number; + }; + uWarpTimeFrequency: { + value: number; + }; + uWarpStrength: { + value: number; + }; + uColor0: { + value: THREE.Color; + }; + uColor1: { + value: THREE.Color; + }; + uColor2: { + value: THREE.Color; + }; + uColor3: { + value: THREE.Color; + }; + uColorMix: { + value: number; + }; + uEdgeThreshold: { + value: number; + }; + uEdgeColor: { + value: THREE.Color; + }; + uChromaticAberration: { + value: number; + }; + uAnisotropicBlur: { + value: number; + }; + uDistortion: { + value: number; + }; + uDistortionScale: { + value: number; + }; + uTemporalDistortion: { + value: number; + }; + uRefractionSamples: { + value: number; + }; + }; +} +export type WobbleMaterialConstructor = new (opts: { + [key: string]: any; +}) => THREE.Material; +type WobbleMaterialParams = ConstructorParameters[0]; +export interface WobbleMaterialProps extends MaterialProps { + /** default:THREE.MeshPhysicalMaterial */ + baseMaterial?: T; + materialParameters?: WobbleMaterialParams; + /** + * An optional callback that is executed immediately before the depth shader program is compiled. + * @param shader — Source code of the shader + * @param renderer — WebGLRenderer Context that is initializing the material + */ + depthOnBeforeCompile?: (shader: THREE.WebGLProgramParametersWithUniforms, renderer: THREE.WebGLRenderer) => void; + /** + * Whether to apply more advanced `transmission` or not. valid only for `MeshPhysicalMaterial`. This is a function referring to `drei/MeshTransmissionMaterial`, default : `false` + * @link https://github.com/pmndrs/drei?tab=readme-ov-file#meshtransmissionmaterial + * */ + isCustomTransmission?: boolean; +} +export declare const useMaterial: ({ baseMaterial, materialParameters, onBeforeCompile, depthOnBeforeCompile, isCustomTransmission, uniforms, }: WobbleMaterialProps) => { + material: Wobble3DMaterial; + depthMaterial: THREE.MeshDepthMaterial; +}; +export {}; 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 new file mode 100644 index 00000000..b85221c1 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/effects/useMotionBlur/index.d.ts @@ -0,0 +1,27 @@ +import * as THREE from "three"; +import { DoubleRenderTarget } from "../../../utils/useDoubleFBO"; +import { CustomParams } from "../../../utils/setUniforms"; +import type { HooksProps, HooksReturn } from "../../types"; +export type MotionBlurParams = { + /** Make this texture blur, default : `THREE.Texture()` */ + texture?: THREE.Texture; + /** motion begin, default : `THREE.Vector2(0, 0)` */ + begin?: THREE.Vector2; + /** motion end, default : `THREE.Vector2(0, 0)` */ + end?: THREE.Vector2; + /** motion strength, default : `0.9` */ + strength?: number; +}; +export type MotionBlurObject = { + scene: THREE.Scene; + mesh: THREE.Mesh; + material: THREE.Material; + camera: THREE.Camera; + renderTarget: DoubleRenderTarget; + output: THREE.Texture; +}; +export declare const MOTIONBLUR_PARAMS: MotionBlurParams; +/** + * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage + */ +export declare const useMotionBlur: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/effects/useMotionBlur/useMesh.d.ts b/packages/use-shader-fx/types/fxs/effects/useMotionBlur/useMesh.d.ts new file mode 100644 index 00000000..66581f94 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/effects/useMotionBlur/useMesh.d.ts @@ -0,0 +1,27 @@ +import * as THREE from "three"; +import { MaterialProps } from "../../types"; +export declare class MotionBlurMaterial extends THREE.ShaderMaterial { + uniforms: { + uTexture: { + value: THREE.Texture; + }; + uBackbuffer: { + value: THREE.Texture; + }; + uBegin: { + value: THREE.Vector2; + }; + uEnd: { + value: THREE.Vector2; + }; + uStrength: { + value: number; + }; + }; +} +export declare const useMesh: ({ scene, uniforms, onBeforeCompile, }: { + scene: THREE.Scene; +} & MaterialProps) => { + material: MotionBlurMaterial; + mesh: THREE.Mesh, MotionBlurMaterial, THREE.Object3DEventMap>; +}; 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 new file mode 100644 index 00000000..c4b92431 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/effects/useSimpleBlur/index.d.ts @@ -0,0 +1,25 @@ +import * as THREE from "three"; +import { DoubleRenderTarget } from "../../../utils/useDoubleFBO"; +import { CustomParams } from "../../../utils/setUniforms"; +import type { HooksProps, HooksReturn } from "../../types"; +export type SimpleBlurParams = { + /** Make this texture blur , default : `THREE.Texture()` */ + texture?: THREE.Texture; + /** blurSize, default : `3` */ + blurSize?: number; + /** blurPower, affects performance default : `5` */ + blurPower?: number; +}; +export type SimpleBlurObject = { + scene: THREE.Scene; + mesh: THREE.Mesh; + material: THREE.Material; + camera: THREE.Camera; + renderTarget: DoubleRenderTarget; + output: THREE.Texture; +}; +export declare const SIMPLEBLUR_PARAMS: SimpleBlurParams; +/** + * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage + */ +export declare const useSimpleBlur: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/effects/useSimpleBlur/useMesh.d.ts b/packages/use-shader-fx/types/fxs/effects/useSimpleBlur/useMesh.d.ts new file mode 100644 index 00000000..95dbd4bf --- /dev/null +++ b/packages/use-shader-fx/types/fxs/effects/useSimpleBlur/useMesh.d.ts @@ -0,0 +1,21 @@ +import * as THREE from "three"; +import { MaterialProps } from "../../types"; +export declare class SampleMaterial extends THREE.ShaderMaterial { + uniforms: { + uTexture: { + value: THREE.Texture; + }; + uResolution: { + value: THREE.Vector2; + }; + uBlurSize: { + value: number; + }; + }; +} +export declare const useMesh: ({ scene, uniforms, onBeforeCompile, }: { + scene: THREE.Scene; +} & MaterialProps) => { + material: SampleMaterial; + mesh: THREE.Mesh, SampleMaterial, THREE.Object3DEventMap>; +}; 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 new file mode 100644 index 00000000..13591fff --- /dev/null +++ b/packages/use-shader-fx/types/fxs/effects/useWave/index.d.ts @@ -0,0 +1,28 @@ +import * as THREE from "three"; +import { CustomParams } from "../../../utils/setUniforms"; +import { HooksProps, HooksReturn } from "../../types"; +export type WaveParams = { + /** -1.0 ~ 1.0 , default : `vec2(0.0,0.0)` */ + epicenter?: THREE.Vector2; + /** 0.0 ~ 1.0 , default : `0.0` */ + progress?: number; + /** default : `0.0` */ + width?: number; + /** default : `0.0` */ + strength?: number; + /** default : `center` */ + mode?: "center" | "horizontal" | "vertical"; +}; +export type WaveObject = { + scene: THREE.Scene; + mesh: THREE.Mesh; + material: THREE.Material; + camera: THREE.Camera; + renderTarget: THREE.WebGLRenderTarget; + output: THREE.Texture; +}; +export declare const WAVE_PARAMS: WaveParams; +/** + * @link https://github.com/FunTechInc/use-shader-fx + */ +export declare const useWave: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/effects/useWave/useMesh.d.ts b/packages/use-shader-fx/types/fxs/effects/useWave/useMesh.d.ts new file mode 100644 index 00000000..346df872 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/effects/useWave/useMesh.d.ts @@ -0,0 +1,27 @@ +import * as THREE from "three"; +import { MaterialProps } from "../../types"; +export declare class WaveMaterial extends THREE.ShaderMaterial { + uniforms: { + uEpicenter: { + value: THREE.Vector2; + }; + uProgress: { + value: number; + }; + uStrength: { + value: number; + }; + uWidth: { + value: number; + }; + uMode: { + value: number; + }; + }; +} +export declare const useMesh: ({ scene, uniforms, onBeforeCompile, }: { + scene: THREE.Scene; +} & MaterialProps) => { + material: WaveMaterial; + mesh: THREE.Mesh, WaveMaterial, THREE.Object3DEventMap>; +}; 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 new file mode 100644 index 00000000..47e9efd9 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/interactions/useBrush/index.d.ts @@ -0,0 +1,44 @@ +import * as THREE from "three"; +import { PointerValues } from "../../../misc/usePointer"; +import { CustomParams } from "../../../utils/setUniforms"; +import { HooksProps, HooksReturn } from "../../types"; +import { DoubleRenderTarget } from "../../../utils/useDoubleFBO"; +export type BrushParams = { + /** Texture applied to the brush, If texture is true, it will take precedence over color , default : `false` */ + texture?: THREE.Texture | false; + /** You can attach an fx map , default : `false` */ + map?: THREE.Texture | false; + /** map intensity , default : `0.1` */ + mapIntensity?: number; + /** size of the stamp, percentage of the size ,default : `0.05` */ + radius?: number; + /** Strength of smudge effect , default : `0.0`*/ + smudge?: number; + /** dissipation rate. If set to 1, it will remain. , default : `1.0` */ + dissipation?: number; + /** Strength of motion blur , default : `0.0` */ + motionBlur?: number; + /** Number of motion blur samples. Affects performance default : `5` */ + motionSample?: number; + /** 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)` */ + color?: ((velocity: THREE.Vector2) => THREE.Vector3) | THREE.Vector3 | THREE.Color; + /** Follows the cursor even if it loses speed , default : `false` */ + isCursor?: boolean; + /** brush pressure (0 to 1) , default : `1.0` */ + pressure?: number; + /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */ + pointerValues?: PointerValues | false; +}; +export type BrushObject = { + scene: THREE.Scene; + mesh: THREE.Mesh; + material: THREE.Material; + camera: THREE.Camera; + renderTarget: DoubleRenderTarget; + output: THREE.Texture; +}; +export declare const BRUSH_PARAMS: BrushParams; +/** + * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage + */ +export declare const useBrush: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/interactions/useBrush/useMesh.d.ts b/packages/use-shader-fx/types/fxs/interactions/useBrush/useMesh.d.ts new file mode 100644 index 00000000..d27c74df --- /dev/null +++ b/packages/use-shader-fx/types/fxs/interactions/useBrush/useMesh.d.ts @@ -0,0 +1,72 @@ +import * as THREE from "three"; +import { Size } from "@react-three/fiber"; +import { MaterialProps } from "../../types"; +export declare class BrushMaterial extends THREE.ShaderMaterial { + uniforms: { + uBuffer: { + value: THREE.Texture; + }; + uTexture: { + value: THREE.Texture; + }; + uIsTexture: { + value: boolean; + }; + uMap: { + value: THREE.Texture; + }; + uIsMap: { + value: boolean; + }; + uMapIntensity: { + value: number; + }; + uResolution: { + value: THREE.Vector2; + }; + uRadius: { + value: number; + }; + uSmudge: { + value: number; + }; + uDissipation: { + value: number; + }; + uMotionBlur: { + value: number; + }; + uMotionSample: { + value: number; + }; + uMouse: { + value: number; + }; + uPrevMouse: { + value: number; + }; + uVelocity: { + value: number; + }; + uColor: { + value: THREE.Vector3 | THREE.Color; + }; + uIsCursor: { + value: boolean; + }; + uPressureStart: { + value: number; + }; + uPressureEnd: { + value: number; + }; + }; +} +export declare const useMesh: ({ scene, size, dpr, uniforms, onBeforeCompile, }: { + scene: THREE.Scene; + size: Size; + dpr: number | false; +} & MaterialProps) => { + material: BrushMaterial; + mesh: THREE.Mesh, BrushMaterial, THREE.Object3DEventMap>; +}; diff --git a/packages/use-shader-fx/types/fxs/misc/useBlank/index.d.ts b/packages/use-shader-fx/types/fxs/misc/useBlank/index.d.ts new file mode 100644 index 00000000..4b65d645 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/misc/useBlank/index.d.ts @@ -0,0 +1,30 @@ +import * as THREE from "three"; +import { BlankMaterial } from "./useMesh"; +import { DoubleRenderTarget } from "../../../utils/useDoubleFBO"; +import { CustomParams } from "../../../utils/setUniforms"; +import type { HooksProps, HooksReturn } from "../../types"; +export type BlankParams = { + /** texture, default : `THREE.Texture()` */ + texture?: THREE.Texture; + /** you can get into the rhythm ♪ , default : `false` */ + beat?: number | false; +}; +export type BlankObject = { + scene: THREE.Scene; + mesh: THREE.Mesh, BlankMaterial>; + material: BlankMaterial; + camera: THREE.Camera; + renderTarget: DoubleRenderTarget; + output: THREE.Texture; +}; +export declare const BLANK_PARAMS: BlankParams; +/** + * By default, it is a blank canvas with nothing drawn on it. You can customise the shaders using `onBeforeCompile`. + * Fragment shaders have `uTexture`,`uBackbuffer`,`uTime`,`uPointer` and `uResolution` as default uniforms. + * + * ※ `usf_FragColor` overrides `gl_FragColor` + * + * ※ `usf_Position` overrides `gl_Position` + * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage + */ +export declare const useBlank: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/misc/useBlank/useMesh.d.ts b/packages/use-shader-fx/types/fxs/misc/useBlank/useMesh.d.ts new file mode 100644 index 00000000..21f833b6 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/misc/useBlank/useMesh.d.ts @@ -0,0 +1,30 @@ +import * as THREE from "three"; +import { MaterialProps } from "../../types"; +import { Size } from "@react-three/fiber"; +export declare class BlankMaterial extends THREE.ShaderMaterial { + uniforms: { + uTexture: { + value: THREE.Texture; + }; + uBackbuffer: { + value: THREE.Texture; + }; + uTime: { + value: number; + }; + uPointer: { + value: THREE.Vector2; + }; + uResolution: { + value: THREE.Vector2; + }; + }; +} +export declare const useMesh: ({ scene, size, dpr, uniforms, onBeforeCompile, }: { + scene: THREE.Scene; + size: Size; + dpr: number | false; +} & MaterialProps) => { + material: BlankMaterial; + mesh: THREE.Mesh, BlankMaterial, THREE.Object3DEventMap>; +}; 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 new file mode 100644 index 00000000..f405e357 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/misc/useChromaKey/index.d.ts @@ -0,0 +1,36 @@ +import * as THREE from "three"; +import { CustomParams } from "../../../utils/setUniforms"; +import { HooksProps, HooksReturn } from "../../types"; +export type ChromaKeyParams = { + /** Process this texture with chroma key , default : `THREE.Texture` */ + texture?: THREE.Texture; + /** key color for chromakey processing , default: `THREE.Color(0x00ff00)` */ + keyColor?: THREE.Color; + /** If the similarity with the key color exceeds this value, it becomes transparent. , default : `0.2` */ + similarity?: number; + /** smoothness , default : `0.1` */ + smoothness?: number; + /** spill , default : `0.2` */ + spill?: number; + /** tone correction , default : `THREE.Vector4(1.0, 1.0, 1.0, 1.0)` */ + color?: THREE.Vector4; + /** contrast , default : `1.0` */ + contrast?: number; + /** brightness , default : `0.0` */ + brightness?: number; + /** gamma correction , default : `1.0` */ + gamma?: number; +}; +export type ChromaKeyObject = { + scene: THREE.Scene; + mesh: THREE.Mesh; + material: THREE.Material; + camera: THREE.Camera; + renderTarget: THREE.WebGLRenderTarget; + output: THREE.Texture; +}; +export declare const CHROMAKEY_PARAMS: ChromaKeyParams; +/** + * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage + */ +export declare const useChromaKey: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/misc/useChromaKey/useMesh.d.ts b/packages/use-shader-fx/types/fxs/misc/useChromaKey/useMesh.d.ts new file mode 100644 index 00000000..f563b718 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/misc/useChromaKey/useMesh.d.ts @@ -0,0 +1,45 @@ +import * as THREE from "three"; +import { Size } from "@react-three/fiber"; +import { MaterialProps } from "../../types"; +export declare class ChromaKeyMaterial extends THREE.ShaderMaterial { + uniforms: { + u_texture: { + value: THREE.Texture; + }; + u_resolution: { + value: THREE.Vector2; + }; + u_keyColor: { + value: THREE.Color; + }; + u_similarity: { + value: number; + }; + u_smoothness: { + value: number; + }; + u_spill: { + value: number; + }; + u_color: { + value: THREE.Vector4; + }; + u_contrast: { + value: number; + }; + u_brightness: { + value: number; + }; + u_gamma: { + value: number; + }; + }; +} +export declare const useMesh: ({ scene, size, dpr, uniforms, onBeforeCompile, }: { + scene: THREE.Scene; + size: Size; + dpr: number | false; +} & MaterialProps) => { + material: ChromaKeyMaterial; + mesh: THREE.Mesh, ChromaKeyMaterial, THREE.Object3DEventMap>; +}; 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 new file mode 100644 index 00000000..e2e9c6c5 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/noises/useColorStrata/index.d.ts @@ -0,0 +1,40 @@ +import * as THREE from "three"; +import { CustomParams } from "../../../utils/setUniforms"; +import { HooksProps, HooksReturn } from "../../types"; +export type ColorStrataParams = { + /** default : `null` */ + texture?: THREE.Texture | false; + /** Valid when texture is false. default : `1` */ + scale?: number; + /** default : `1.0` */ + laminateLayer?: number; + /** default : `(0.1, 0.1)` */ + laminateInterval?: THREE.Vector2; + /** default : `(1.0, 1.0)` */ + laminateDetail?: THREE.Vector2; + /** default : `(0.0, 0.0)` */ + distortion?: THREE.Vector2; + /** default : `(1.0, 1.0, 1.0)` */ + colorFactor?: THREE.Vector3; + /** default : `(0.0, 0.0)` */ + timeStrength?: THREE.Vector2; + /** default : `false` */ + noise?: THREE.Texture | false; + /** default : `(0.0,0.0)` */ + noiseStrength?: THREE.Vector2; + /** you can get into the rhythm ♪ , default : `false` */ + beat?: number | false; +}; +export type ColorStrataObject = { + scene: THREE.Scene; + mesh: THREE.Mesh; + material: THREE.Material; + camera: THREE.Camera; + renderTarget: THREE.WebGLRenderTarget; + output: THREE.Texture; +}; +export declare const COLORSTRATA_PARAMS: ColorStrataParams; +/** + * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage + */ +export declare const useColorStrata: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/noises/useColorStrata/useMesh.d.ts b/packages/use-shader-fx/types/fxs/noises/useColorStrata/useMesh.d.ts new file mode 100644 index 00000000..c3c2bd7a --- /dev/null +++ b/packages/use-shader-fx/types/fxs/noises/useColorStrata/useMesh.d.ts @@ -0,0 +1,51 @@ +import * as THREE from "three"; +import { MaterialProps } from "../../types"; +export declare class ColorStrataMaterial extends THREE.ShaderMaterial { + uniforms: { + uTexture: { + value: THREE.Texture; + }; + isTexture: { + value: boolean; + }; + scale: { + value: number; + }; + noise: { + value: THREE.Texture; + }; + noiseStrength: { + value: THREE.Vector2; + }; + isNoise: { + value: boolean; + }; + laminateLayer: { + value: number; + }; + laminateInterval: { + value: THREE.Vector2; + }; + laminateDetail: { + value: THREE.Vector2; + }; + distortion: { + value: THREE.Vector2; + }; + colorFactor: { + value: THREE.Vector3; + }; + uTime: { + value: number; + }; + timeStrength: { + value: THREE.Vector2; + }; + }; +} +export declare const useMesh: ({ scene, uniforms, onBeforeCompile, }: { + scene: THREE.Scene; +} & MaterialProps) => { + material: ColorStrataMaterial; + mesh: THREE.Mesh, ColorStrataMaterial, THREE.Object3DEventMap>; +}; 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 new file mode 100644 index 00000000..915af6d6 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/noises/useCosPalette/index.d.ts @@ -0,0 +1,30 @@ +import * as THREE from "three"; +import { CustomParams } from "../../../utils/setUniforms"; +import { HooksProps, HooksReturn } from "../../types"; +export type CosPaletteParams = { + /** color1, default : `rgb(50%, 50%, 50%)` */ + color1?: THREE.Color; + /** color2, default : `rgb(50%, 50%, 50%)` */ + color2?: THREE.Color; + /** color3, default : `rgb(100%, 100%, 100%)` */ + color3?: THREE.Color; + /** color4, default : `rgb(0%, 10%, 20%)` */ + color4?: THREE.Color; + /** texture to be used as a palette */ + texture?: THREE.Texture; + /** weight of the rgb, default : `THREE.Vector3(1.0,0.0,0.0)` */ + rgbWeight?: THREE.Vector3; +}; +export type ColorPaletteObject = { + scene: THREE.Scene; + mesh: THREE.Mesh; + material: THREE.Material; + camera: THREE.Camera; + renderTarget: THREE.WebGLRenderTarget; + output: THREE.Texture; +}; +export declare const COSPALETTE_PARAMS: CosPaletteParams; +/** + * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage + */ +export declare const useCosPalette: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/noises/useCosPalette/useMesh.d.ts b/packages/use-shader-fx/types/fxs/noises/useCosPalette/useMesh.d.ts new file mode 100644 index 00000000..1819a36a --- /dev/null +++ b/packages/use-shader-fx/types/fxs/noises/useCosPalette/useMesh.d.ts @@ -0,0 +1,30 @@ +import * as THREE from "three"; +import { MaterialProps } from "../../types"; +export declare class CosPaletteMaterial extends THREE.ShaderMaterial { + uniforms: { + uTexture: { + value: THREE.Texture; + }; + uRgbWeight: { + value: THREE.Vector3; + }; + uColor1: { + value: THREE.Color; + }; + uColor2: { + value: THREE.Color; + }; + uColor3: { + value: THREE.Color; + }; + uColor4: { + value: THREE.Color; + }; + }; +} +export declare const useMesh: ({ scene, uniforms, onBeforeCompile, }: { + scene: THREE.Scene; +} & MaterialProps) => { + material: CosPaletteMaterial; + mesh: THREE.Mesh, CosPaletteMaterial, THREE.Object3DEventMap>; +}; 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 new file mode 100644 index 00000000..4992eaea --- /dev/null +++ b/packages/use-shader-fx/types/fxs/noises/useMarble/index.d.ts @@ -0,0 +1,32 @@ +import * as THREE from "three"; +import { CustomParams } from "../../../utils/setUniforms"; +import { HooksProps, HooksReturn } from "../../types"; +export type MarbleParams = { + /** You can add random patterns to noise by passing random numbers ,default : `0` */ + pattern?: number; + /** default : `2` */ + complexity?: number; + /** default : `0.2` */ + complexityAttenuation?: number; + /** default : `8` */ + iterations?: number; + /** default : `0.2` */ + timeStrength?: number; + /** default : `0.002` */ + scale?: number; + /** you can get into the rhythm ♪ , default : `false` */ + beat?: number | false; +}; +export type MarbleObject = { + scene: THREE.Scene; + mesh: THREE.Mesh; + material: THREE.Material; + camera: THREE.Camera; + renderTarget: THREE.WebGLRenderTarget; + output: THREE.Texture; +}; +export declare const MARBLE_PARAMS: MarbleParams; +/** + * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage + */ +export declare const useMarble: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/noises/useMarble/useMesh.d.ts b/packages/use-shader-fx/types/fxs/noises/useMarble/useMesh.d.ts new file mode 100644 index 00000000..44d16ee5 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/noises/useMarble/useMesh.d.ts @@ -0,0 +1,33 @@ +import * as THREE from "three"; +import { MaterialProps } from "../../types"; +export declare class MarbleMaterial extends THREE.ShaderMaterial { + uniforms: { + u_time: { + value: number; + }; + u_pattern: { + value: number; + }; + u_complexity: { + value: number; + }; + u_complexityAttenuation: { + value: number; + }; + u_iterations: { + value: number; + }; + u_timeStrength: { + value: number; + }; + u_scale: { + value: number; + }; + }; +} +export declare const useMesh: ({ scene, uniforms, onBeforeCompile, }: { + scene: THREE.Scene; +} & MaterialProps) => { + material: MarbleMaterial; + mesh: THREE.Mesh, MarbleMaterial, THREE.Object3DEventMap>; +}; 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 new file mode 100644 index 00000000..9f59ffbc --- /dev/null +++ b/packages/use-shader-fx/types/fxs/noises/useNoise/index.d.ts @@ -0,0 +1,36 @@ +import * as THREE from "three"; +import { CustomParams } from "../../../utils/setUniforms"; +import { HooksProps, HooksReturn } from "../../types"; +export type NoiseParams = { + /** noise scale , default : `0.004` */ + scale?: number; + /** time factor default : `0.3` */ + timeStrength?: number; + /** noiseOctaves, affects performance default : `2` */ + noiseOctaves?: number; + /** fbmOctaves, affects performance default : `2` */ + fbmOctaves?: number; + /** domain warping octaves , affects performance default : `2` */ + warpOctaves?: number; + /** direction of domain warping , default : `(2.0,2,0)` */ + warpDirection?: THREE.Vector2; + /** strength of domain warping , default : `8.0` */ + warpStrength?: number; + /** you can get into the rhythm ♪ , default : `false` */ + beat?: number | false; +}; +export type NoiseObject = { + scene: THREE.Scene; + mesh: THREE.Mesh; + material: THREE.Material; + camera: THREE.Camera; + renderTarget: THREE.WebGLRenderTarget; + output: THREE.Texture; +}; +export declare const NOISE_PARAMS: NoiseParams; +/** + * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage + * + * It is a basic value noise with `fbm` and `domain warping` + */ +export declare const useNoise: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/noises/useNoise/useMesh.d.ts b/packages/use-shader-fx/types/fxs/noises/useNoise/useMesh.d.ts new file mode 100644 index 00000000..a2fe1ae2 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/noises/useNoise/useMesh.d.ts @@ -0,0 +1,36 @@ +import * as THREE from "three"; +import { MaterialProps } from "../../types"; +export declare class NoiseMaterial extends THREE.ShaderMaterial { + uniforms: { + uTime: { + value: number; + }; + scale: { + value: number; + }; + timeStrength: { + value: number; + }; + noiseOctaves: { + value: number; + }; + fbmOctaves: { + value: number; + }; + warpOctaves: { + value: number; + }; + warpDirection: { + value: THREE.Vector2; + }; + warpStrength: { + value: number; + }; + }; +} +export declare const useMesh: ({ scene, uniforms, onBeforeCompile, }: { + scene: THREE.Scene; +} & MaterialProps) => { + material: NoiseMaterial; + mesh: THREE.Mesh, NoiseMaterial, THREE.Object3DEventMap>; +}; 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 new file mode 100644 index 00000000..913f01c2 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/simulations/useFluid/index.d.ts @@ -0,0 +1,59 @@ +import * as THREE from "three"; +import { FluidMaterials, CustomFluidProps, CustomFluidParams } from "./useMesh"; +import { PointerValues } from "../../../misc/usePointer"; +import { HooksProps, HooksReturn } from "../../types"; +import { DoubleRenderTarget } from "../../../utils/useDoubleFBO"; +export declare const DELTA_TIME = 0.016; +export type FluidParams = { + /** density disspation , default : `0.98` */ + density_dissipation?: number; + /** velocity dissipation , default : `0.99` */ + velocity_dissipation?: number; + /** velocity acceleration , default : `10.0` */ + velocity_acceleration?: number; + /** pressure dissipation , default : `0.9` */ + pressure_dissipation?: number; + /** pressure iterations. affects performance , default : `20` */ + pressure_iterations?: number; + /** curl_strength , default : `35` */ + curl_strength?: number; + /** splat radius , default : `0.002` */ + splat_radius?: number; + /** 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)` */ + fluid_color?: ((velocity: THREE.Vector2) => THREE.Vector3) | THREE.Vector3 | THREE.Color; + /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */ + pointerValues?: PointerValues | false; +}; +export type FluidObject = { + scene: THREE.Scene; + mesh: THREE.Mesh; + materials: FluidMaterials; + camera: THREE.Camera; + renderTarget: { + velocity: DoubleRenderTarget; + density: DoubleRenderTarget; + curl: THREE.WebGLRenderTarget; + divergence: THREE.WebGLRenderTarget; + pressure: DoubleRenderTarget; + }; + output: THREE.Texture; +}; +export declare const FLUID_PARAMS: FluidParams; +/** + * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage + */ +export declare const useFluid: ({ size, dpr, samples, isSizeUpdate, customFluidProps, }: { + /** you can add `onBeforeComile` of the next material.`initial`,`curl`,`vorticity`,`advection`,`divergence`,`pressure`,`clear`,`gradientSubtract`,`splat` + * ```ts + * fluidOnBeforeCompile: { + vorticity: { + onBeforeCompile: (shader) => console.log(shader), + uniforms:{ + hoge: { value: 0.0 }, + } + }, + }, + * ``` + */ + customFluidProps?: CustomFluidProps | undefined; +} & HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useAdvectionMaterial.d.ts b/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useAdvectionMaterial.d.ts new file mode 100644 index 00000000..0305950b --- /dev/null +++ b/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useAdvectionMaterial.d.ts @@ -0,0 +1,22 @@ +import * as THREE from "three"; +import { MaterialProps } from "../../../types"; +export declare class AdvectionMaterial extends THREE.ShaderMaterial { + uniforms: { + uVelocity: { + value: THREE.Texture; + }; + uSource: { + value: THREE.Texture; + }; + texelSize: { + value: THREE.Vector2; + }; + dt: { + value: number; + }; + dissipation: { + value: number; + }; + }; +} +export declare const useAdvectionMaterial: ({ onBeforeCompile, uniforms, }: MaterialProps) => AdvectionMaterial; diff --git a/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useClearMaterial.d.ts b/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useClearMaterial.d.ts new file mode 100644 index 00000000..d1f87aa0 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useClearMaterial.d.ts @@ -0,0 +1,16 @@ +import * as THREE from "three"; +import { MaterialProps } from "../../../types"; +export declare class ClearMaterial extends THREE.ShaderMaterial { + uniforms: { + uTexture: { + value: THREE.Texture; + }; + value: { + value: number; + }; + texelSize: { + value: THREE.Vector2; + }; + }; +} +export declare const useClearMaterial: ({ onBeforeCompile, uniforms, }: MaterialProps) => ClearMaterial; diff --git a/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useCurlMaterial.d.ts b/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useCurlMaterial.d.ts new file mode 100644 index 00000000..f9e2dd85 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useCurlMaterial.d.ts @@ -0,0 +1,13 @@ +import * as THREE from "three"; +import { MaterialProps } from "../../../types"; +export declare class CurlMaterial extends THREE.ShaderMaterial { + uniforms: { + uVelocity: { + value: THREE.Texture; + }; + texelSize: { + value: THREE.Vector2; + }; + }; +} +export declare const useCurlMaterial: ({ onBeforeCompile, uniforms, }: MaterialProps) => CurlMaterial; diff --git a/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useDivergenceMaterial.d.ts b/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useDivergenceMaterial.d.ts new file mode 100644 index 00000000..d9fc7cc6 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useDivergenceMaterial.d.ts @@ -0,0 +1,13 @@ +import * as THREE from "three"; +import { MaterialProps } from "../../../types"; +export declare class DivergenceMaterial extends THREE.ShaderMaterial { + uniforms: { + uVelocity: { + value: THREE.Texture; + }; + texelSize: { + value: THREE.Vector2; + }; + }; +} +export declare const useDivergenceMaterial: ({ onBeforeCompile, uniforms, }: MaterialProps) => DivergenceMaterial; diff --git a/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useGradientSubtractMaterial.d.ts b/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useGradientSubtractMaterial.d.ts new file mode 100644 index 00000000..49d42797 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useGradientSubtractMaterial.d.ts @@ -0,0 +1,16 @@ +import * as THREE from "three"; +import { MaterialProps } from "../../../types"; +export declare class GradientSubtractMaterial extends THREE.ShaderMaterial { + uniforms: { + uPressure: { + value: THREE.Texture; + }; + uVelocity: { + value: THREE.Texture; + }; + texelSize: { + value: THREE.Vector2; + }; + }; +} +export declare const useGradientSubtractMaterial: ({ onBeforeCompile, uniforms, }: MaterialProps) => GradientSubtractMaterial; diff --git a/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useInitialMaterial.d.ts b/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useInitialMaterial.d.ts new file mode 100644 index 00000000..6322827a --- /dev/null +++ b/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useInitialMaterial.d.ts @@ -0,0 +1,2 @@ +import * as THREE from "three"; +export declare const useInitialMaterial: () => THREE.ShaderMaterial; diff --git a/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/usePressureMaterial.d.ts b/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/usePressureMaterial.d.ts new file mode 100644 index 00000000..923a8b89 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/usePressureMaterial.d.ts @@ -0,0 +1,16 @@ +import * as THREE from "three"; +import { MaterialProps } from "../../../types"; +export declare class PressureMaterial extends THREE.ShaderMaterial { + uniforms: { + uPressure: { + value: THREE.Texture; + }; + uDivergence: { + value: THREE.Texture; + }; + texelSize: { + value: THREE.Vector2; + }; + }; +} +export declare const usePressureMaterial: ({ onBeforeCompile, uniforms, }: MaterialProps) => PressureMaterial; diff --git a/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useSplatMaterial.d.ts b/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useSplatMaterial.d.ts new file mode 100644 index 00000000..cfea05f6 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useSplatMaterial.d.ts @@ -0,0 +1,25 @@ +import * as THREE from "three"; +import { MaterialProps } from "../../../types"; +export declare class SplatMaterial extends THREE.ShaderMaterial { + uniforms: { + uTarget: { + value: THREE.Texture; + }; + aspectRatio: { + value: number; + }; + color: { + value: THREE.Vector3 | THREE.Color; + }; + point: { + value: THREE.Vector2; + }; + radius: { + value: number; + }; + texelSize: { + value: THREE.Vector2; + }; + }; +} +export declare const useSplatMaterial: ({ onBeforeCompile, uniforms, }: MaterialProps) => SplatMaterial; diff --git a/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useVorticityMaterial.d.ts b/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useVorticityMaterial.d.ts new file mode 100644 index 00000000..af3b80eb --- /dev/null +++ b/packages/use-shader-fx/types/fxs/simulations/useFluid/materials/useVorticityMaterial.d.ts @@ -0,0 +1,22 @@ +import * as THREE from "three"; +import { MaterialProps } from "../../../types"; +export declare class VorticityMaterial extends THREE.ShaderMaterial { + uniforms: { + uVelocity: { + value: THREE.Texture; + }; + uCurl: { + value: THREE.Texture; + }; + curl: { + value: number; + }; + dt: { + value: number; + }; + texelSize: { + value: THREE.Vector2; + }; + }; +} +export declare const useVorticityMaterial: ({ onBeforeCompile, uniforms, }: MaterialProps) => VorticityMaterial; diff --git a/packages/use-shader-fx/types/fxs/simulations/useFluid/useMesh.d.ts b/packages/use-shader-fx/types/fxs/simulations/useFluid/useMesh.d.ts new file mode 100644 index 00000000..44d489b7 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/simulations/useFluid/useMesh.d.ts @@ -0,0 +1,53 @@ +import * as THREE from "three"; +import { AdvectionMaterial } from "./materials/useAdvectionMaterial"; +import { DivergenceMaterial } from "./materials/useDivergenceMaterial"; +import { PressureMaterial } from "./materials/usePressureMaterial"; +import { CurlMaterial } from "./materials/useCurlMaterial"; +import { VorticityMaterial } from "./materials/useVorticityMaterial"; +import { ClearMaterial } from "./materials/useClearMaterial"; +import { GradientSubtractMaterial } from "./materials/useGradientSubtractMaterial"; +import { SplatMaterial } from "./materials/useSplatMaterial"; +import { CustomParams } from "../../../utils/setUniforms"; +import { Size } from "@react-three/fiber"; +import { MaterialProps } from "../../types"; +type TMaterials = AdvectionMaterial | DivergenceMaterial | CurlMaterial | PressureMaterial | ClearMaterial | GradientSubtractMaterial | SplatMaterial; +export type FluidMaterials = { + vorticityMaterial: VorticityMaterial; + curlMaterial: CurlMaterial; + advectionMaterial: AdvectionMaterial; + divergenceMaterial: DivergenceMaterial; + pressureMaterial: PressureMaterial; + clearMaterial: ClearMaterial; + gradientSubtractMaterial: GradientSubtractMaterial; + splatMaterial: SplatMaterial; +}; +export type CustomizableKeys = "advection" | "splat" | "curl" | "vorticity" | "divergence" | "clear" | "pressure" | "gradientSubtract"; +export type CustomFluidProps = { + [K in CustomizableKeys]?: MaterialProps; +}; +export type CustomFluidParams = { + [K in CustomizableKeys]?: CustomParams; +}; +/** + * Returns the material update function in the second argument + */ +export declare const useMesh: ({ scene, size, dpr, customFluidProps, }: { + scene: THREE.Scene; + size: Size; + dpr: number | false; + customFluidProps?: CustomFluidProps | undefined; +}) => { + materials: { + vorticityMaterial: VorticityMaterial; + curlMaterial: CurlMaterial; + advectionMaterial: AdvectionMaterial; + divergenceMaterial: DivergenceMaterial; + pressureMaterial: PressureMaterial; + clearMaterial: ClearMaterial; + gradientSubtractMaterial: GradientSubtractMaterial; + splatMaterial: SplatMaterial; + }; + setMeshMaterial: (material: TMaterials) => void; + mesh: THREE.Mesh, THREE.ShaderMaterial, THREE.Object3DEventMap>; +}; +export {}; 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 new file mode 100644 index 00000000..3981de6b --- /dev/null +++ b/packages/use-shader-fx/types/fxs/simulations/useRipple/index.d.ts @@ -0,0 +1,39 @@ +import * as THREE from "three"; +import { PointerValues } from "../../../misc/usePointer"; +import { HooksProps, HooksReturn } from "../../types"; +import { CustomParams } from "../../../utils/setUniforms"; +export type RippleParams = { + /** How often ripples appear, default : `0.01` */ + frequency?: number; + /** rotation rate, default : `0.05` */ + rotation?: number; + /** fadeout speed, default : `0.9` */ + fadeout_speed?: number; + /** scale rate, default : `0.3` */ + scale?: number; + /** alpha, default : `0.6` */ + alpha?: number; + /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */ + pointerValues?: PointerValues | false; +}; +export type RippleObject = { + scene: THREE.Scene; + meshArr: THREE.Mesh[]; + camera: THREE.Camera; + renderTarget: THREE.WebGLRenderTarget; + output: THREE.Texture; +}; +export declare const RIPPLE_PARAMS: RippleParams; +interface UseRippleProps extends HooksProps { + /** texture applied to ripple */ + texture?: THREE.Texture; + /** ripple size, default:64 */ + scale?: number; + /** ripple max length, default:100 */ + max?: number; +} +/** + * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage + */ +export declare const useRipple: ({ texture, scale, max, size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: UseRippleProps) => HooksReturn; +export {}; diff --git a/packages/use-shader-fx/types/fxs/simulations/useRipple/useMesh.d.ts b/packages/use-shader-fx/types/fxs/simulations/useRipple/useMesh.d.ts new file mode 100644 index 00000000..31076071 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/simulations/useRipple/useMesh.d.ts @@ -0,0 +1,10 @@ +import * as THREE from "three"; +import { MaterialProps } from "../../types"; +type UseMeshProps = { + scale: number; + max: number; + scene: THREE.Scene; + texture?: THREE.Texture; +}; +export declare const useMesh: ({ scale, max, texture, scene, uniforms, onBeforeCompile, }: UseMeshProps & MaterialProps) => THREE.Mesh[]; +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 new file mode 100644 index 00000000..41b7180d --- /dev/null +++ b/packages/use-shader-fx/types/fxs/types/index.d.ts @@ -0,0 +1,57 @@ +import * as THREE from "three"; +import { RootState, Size } from "@react-three/fiber"; +export type Dpr = number | { + /** you can set whether `dpr` affects `shader`. default : `false` */ + shader?: false | number; + /** you can set whether `dpr` affects `fbo`. default : `false` */ + fbo?: false | number; +}; +export type MaterialProps = { + /** It is possible to add your own uniforms - they are not added to the GLSL and must be replace with `onBeforeCompile` */ + uniforms?: { + [uniform: string]: THREE.IUniform; + }; + /** + * An optional callback that is executed immediately before the shader program is compiled. `use-shader-fx` already defines `onBeforeCompile`, so pass the function to this props instead of redefining it in material. + * @param parameters — WebGL program parameters + * @param renderer — WebGLRenderer Context that is initializing the material + */ + onBeforeCompile?: (parameters: THREE.WebGLProgramParametersWithUniforms, renderer: THREE.WebGLRenderer) => void; +}; +export interface HooksProps extends MaterialProps { + size: Size; + dpr: Dpr; + /** Defines the count of MSAA samples. Can only be used with WebGL 2. default : `0` */ + samples?: number; + /** Whether to `setSize` the FBO when updating size or dpr. default : `false` */ + isSizeUpdate?: boolean; +} +/** + * @returns {HooksReturn} + * updateFx - Functions to update parameters and render. + * updateParams - Function to update parameters only. + * fxObject - An object containing various FX components such as scene, camera, material, and render target. + * + * @template T The type for the parameters of the hooks. + * @template O The type for the FX object. + * @template C The type for the custom parameters. + */ +export type HooksReturn = [ + /** + * Functions to update parameters and render. + * @param rootState RootState + * @param newParams params of fxHooks + * @param customParams custom params, added to `uniforms` during initialisation + */ + (rootState: RootState, newParams?: T, customParams?: C) => THREE.Texture, + /** + * Function to update parameters only. + * @param newParams params of fxHooks + * @param customParams custom params, added to `uniforms` during initialisation + */ + (newParams?: T, customParams?: C) => void, + /** + * Contains each part of FX such as scene, camera, material, render target, etc. + */ + O +]; 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 new file mode 100644 index 00000000..d6067992 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/utils/useAlphaBlending/index.d.ts @@ -0,0 +1,22 @@ +import * as THREE from "three"; +import { CustomParams } from "../../../utils/setUniforms"; +import { HooksProps, HooksReturn } from "../../types"; +export type AlphaBlendingParams = { + /** default : `THREE.Texture()` */ + texture?: THREE.Texture; + /** alpha map , default : `THREE.Texture()` */ + map?: THREE.Texture; +}; +export type AlphaBlendingObject = { + scene: THREE.Scene; + mesh: THREE.Mesh; + material: THREE.Material; + camera: THREE.Camera; + renderTarget: THREE.WebGLRenderTarget; + output: THREE.Texture; +}; +export declare const ALPHABLENDING_PARAMS: AlphaBlendingParams; +/** + * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage + */ +export declare const useAlphaBlending: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useAlphaBlending/useMesh.d.ts b/packages/use-shader-fx/types/fxs/utils/useAlphaBlending/useMesh.d.ts new file mode 100644 index 00000000..12804af0 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/utils/useAlphaBlending/useMesh.d.ts @@ -0,0 +1,20 @@ +import * as THREE from "three"; +import { Size } from "@react-three/fiber"; +import { MaterialProps } from "../../types"; +export declare class AlphaBlendingMaterial extends THREE.ShaderMaterial { + uniforms: { + uTexture: { + value: THREE.Texture; + }; + uMap: { + value: THREE.Texture; + }; + }; +} +export declare const useMesh: ({ scene, uniforms, onBeforeCompile, }: { + scene: THREE.Scene; + size: Size; +} & MaterialProps) => { + material: AlphaBlendingMaterial; + mesh: THREE.Mesh, AlphaBlendingMaterial, THREE.Object3DEventMap>; +}; 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 new file mode 100644 index 00000000..341c196f --- /dev/null +++ b/packages/use-shader-fx/types/fxs/utils/useBlending/index.d.ts @@ -0,0 +1,36 @@ +import * as THREE from "three"; +import { CustomParams } from "../../../utils/setUniforms"; +import { HooksProps, HooksReturn } from "../../types"; +export type BlendingParams = { + /** Make this texture Blending , default : `THREE.Texture` */ + texture?: THREE.Texture; + /** map texture, default : `THREE.Texture` */ + map?: THREE.Texture; + /** map strength , r,g value are affecting , default : `0.3` */ + mapIntensity?: number; + /** Alpha blending is performed using the alpha of the set texture. , default : `false` */ + alphaMap?: THREE.Texture | false; + /** default : `(0.5,0.5,0.5)` */ + brightness?: THREE.Vector3; + /** default : `0.0` */ + min?: number; + /** default : `1.0` */ + max?: number; + /** If set, this value will apply color dodge , default : `false` */ + dodgeColor?: THREE.Color | false; +}; +export type BlendingObject = { + scene: THREE.Scene; + mesh: THREE.Mesh; + material: THREE.Material; + camera: THREE.Camera; + renderTarget: THREE.WebGLRenderTarget; + output: THREE.Texture; +}; +export declare const BLENDING_PARAMS: BlendingParams; +/** + * Blend map to texture. You can set the threshold for blending with brightness. You can set the dodge color by setting color. +If you don't want to reflect the map's color, you can use useFxBlending instead. + * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage + */ +export declare const useBlending: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useBlending/useMesh.d.ts b/packages/use-shader-fx/types/fxs/utils/useBlending/useMesh.d.ts new file mode 100644 index 00000000..1160ae96 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/utils/useBlending/useMesh.d.ts @@ -0,0 +1,42 @@ +import * as THREE from "three"; +import { MaterialProps } from "../../types"; +export declare class BlendingMaterial extends THREE.ShaderMaterial { + uniforms: { + u_texture: { + value: THREE.Texture; + }; + uMap: { + value: THREE.Texture; + }; + u_alphaMap: { + value: THREE.Texture; + }; + u_isAlphaMap: { + value: boolean; + }; + uMapIntensity: { + value: number; + }; + u_brightness: { + value: THREE.Vector3; + }; + u_min: { + value: number; + }; + u_max: { + value: number; + }; + u_dodgeColor: { + value: THREE.Color; + }; + u_isDodgeColor: { + value: boolean; + }; + }; +} +export declare const useMesh: ({ scene, uniforms, onBeforeCompile, }: { + scene: THREE.Scene; +} & MaterialProps) => { + material: BlendingMaterial; + mesh: THREE.Mesh, BlendingMaterial, THREE.Object3DEventMap>; +}; 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 new file mode 100644 index 00000000..dde48bae --- /dev/null +++ b/packages/use-shader-fx/types/fxs/utils/useBrightnessPicker/index.d.ts @@ -0,0 +1,26 @@ +import * as THREE from "three"; +import { CustomParams } from "../../../utils/setUniforms"; +import { HooksProps, HooksReturn } from "../../types"; +export type BrightnessPickerParams = { + /** pick brightness from this texture , default : `THREE.Texture` */ + texture?: THREE.Texture; + /** default : `(0.5,0.5,0.5)` */ + brightness?: THREE.Vector3; + /** default : `0.0` */ + min?: number; + /** default : `1.0` */ + max?: number; +}; +export type BrightnessPickerObject = { + scene: THREE.Scene; + mesh: THREE.Mesh; + material: THREE.Material; + camera: THREE.Camera; + renderTarget: THREE.WebGLRenderTarget; + output: THREE.Texture; +}; +export declare const BRIGHTNESSPICKER_PARAMS: BrightnessPickerParams; +/** + * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage + */ +export declare const useBrightnessPicker: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useBrightnessPicker/useMesh.d.ts b/packages/use-shader-fx/types/fxs/utils/useBrightnessPicker/useMesh.d.ts new file mode 100644 index 00000000..43cf45fb --- /dev/null +++ b/packages/use-shader-fx/types/fxs/utils/useBrightnessPicker/useMesh.d.ts @@ -0,0 +1,24 @@ +import * as THREE from "three"; +import { MaterialProps } from "../../types"; +export declare class BrightnessPickerMaterial extends THREE.ShaderMaterial { + uniforms: { + u_texture: { + value: THREE.Texture; + }; + u_brightness: { + value: THREE.Vector3; + }; + u_min: { + value: number; + }; + u_max: { + value: number; + }; + }; +} +export declare const useMesh: ({ scene, uniforms, onBeforeCompile, }: { + scene: THREE.Scene; +} & MaterialProps) => { + material: BrightnessPickerMaterial; + mesh: THREE.Mesh, BrightnessPickerMaterial, THREE.Object3DEventMap>; +}; 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 new file mode 100644 index 00000000..253c2b1d --- /dev/null +++ b/packages/use-shader-fx/types/fxs/utils/useCoverTexture/index.d.ts @@ -0,0 +1,20 @@ +import * as THREE from "three"; +import { CustomParams } from "../../../utils/setUniforms"; +import { HooksProps, HooksReturn } from "../../types"; +export type CoverTextureParams = { + /** Textures that you want to display exactly on the screen , default : `THREE.Texture()` */ + texture?: THREE.Texture; +}; +export type CoverTextureObject = { + scene: THREE.Scene; + mesh: THREE.Mesh; + material: THREE.Material; + camera: THREE.Camera; + renderTarget: THREE.WebGLRenderTarget; + output: THREE.Texture; +}; +export declare const COVERTEXTURE_PARAMS: CoverTextureParams; +/** + * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage + */ +export declare const useCoverTexture: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useCoverTexture/useMesh.d.ts b/packages/use-shader-fx/types/fxs/utils/useCoverTexture/useMesh.d.ts new file mode 100644 index 00000000..8c4675c6 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/utils/useCoverTexture/useMesh.d.ts @@ -0,0 +1,24 @@ +import * as THREE from "three"; +import { Size } from "@react-three/fiber"; +import { MaterialProps } from "../../types"; +export declare class FxTextureMaterial extends THREE.ShaderMaterial { + uniforms: { + uResolution: { + value: THREE.Vector2; + }; + uTextureResolution: { + value: THREE.Vector2; + }; + uTexture: { + value: THREE.Texture; + }; + }; +} +export declare const useMesh: ({ scene, size, dpr, uniforms, onBeforeCompile, }: { + scene: THREE.Scene; + size: Size; + dpr: number | false; +} & MaterialProps) => { + material: FxTextureMaterial; + mesh: THREE.Mesh, FxTextureMaterial, THREE.Object3DEventMap>; +}; 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 new file mode 100644 index 00000000..c9721a04 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/utils/useDuoTone/index.d.ts @@ -0,0 +1,25 @@ +import * as THREE from "three"; +import { DuoToneMaterial } from "./useMesh"; +import { CustomParams } from "../../../utils/setUniforms"; +import { HooksProps, HooksReturn } from "../../types"; +export type DuoToneParams = { + /** Make this texture duotone , Default : `THREE.Texture()` */ + texture?: THREE.Texture; + /** 1st color , Default : `THREE.Color(0xffffff)` */ + color0?: THREE.Color; + /** 2nd color , Default : `THREE.Color(0x000000)` */ + color1?: THREE.Color; +}; +export type DuoToneObject = { + scene: THREE.Scene; + mesh: THREE.Mesh; + material: DuoToneMaterial; + camera: THREE.Camera; + renderTarget: THREE.WebGLRenderTarget; + output: THREE.Texture; +}; +export declare const DUOTONE_PARAMS: DuoToneParams; +/** + * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage + */ +export declare const useDuoTone: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useDuoTone/useMesh.d.ts b/packages/use-shader-fx/types/fxs/utils/useDuoTone/useMesh.d.ts new file mode 100644 index 00000000..d6cf79d1 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/utils/useDuoTone/useMesh.d.ts @@ -0,0 +1,21 @@ +import * as THREE from "three"; +import { MaterialProps } from "../../types"; +export declare class DuoToneMaterial extends THREE.ShaderMaterial { + uniforms: { + uTexture: { + value: THREE.Texture; + }; + uColor0: { + value: THREE.Color; + }; + uColor1: { + value: THREE.Color; + }; + }; +} +export declare const useMesh: ({ scene, uniforms, onBeforeCompile, }: { + scene: THREE.Scene; +} & MaterialProps) => { + material: DuoToneMaterial; + mesh: THREE.Mesh, DuoToneMaterial, THREE.Object3DEventMap>; +}; 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 new file mode 100644 index 00000000..f245d53c --- /dev/null +++ b/packages/use-shader-fx/types/fxs/utils/useFxBlending/index.d.ts @@ -0,0 +1,25 @@ +import * as THREE from "three"; +import { CustomParams } from "../../../utils/setUniforms"; +import { HooksProps, HooksReturn } from "../../types"; +export type FxBlendingParams = { + /** Make this texture Blending , default : `THREE.Texture` */ + texture?: THREE.Texture; + /** map texture, default : `THREE.Texture` */ + map?: THREE.Texture; + /** map strength , r,g value are affecting , default : `0.3` */ + mapIntensity?: number; +}; +export type FxBlendingObject = { + scene: THREE.Scene; + mesh: THREE.Mesh; + material: THREE.Material; + camera: THREE.Camera; + renderTarget: THREE.WebGLRenderTarget; + output: THREE.Texture; +}; +export declare const FXBLENDING_PARAMS: FxBlendingParams; +/** + * Blend map to texture. You can change the intensity of fx applied by the rg value of map. Unlike "useBlending", the map color is not reflected. + * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage + */ +export declare const useFxBlending: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useFxBlending/useMesh.d.ts b/packages/use-shader-fx/types/fxs/utils/useFxBlending/useMesh.d.ts new file mode 100644 index 00000000..cce5af20 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/utils/useFxBlending/useMesh.d.ts @@ -0,0 +1,21 @@ +import * as THREE from "three"; +import { MaterialProps } from "../../types"; +export declare class FxBlendingMaterial extends THREE.ShaderMaterial { + uniforms: { + u_texture: { + value: THREE.Texture; + }; + uMap: { + value: THREE.Texture; + }; + uMapIntensity: { + value: number; + }; + }; +} +export declare const useMesh: ({ scene, uniforms, onBeforeCompile, }: { + scene: THREE.Scene; +} & MaterialProps) => { + material: FxBlendingMaterial; + mesh: THREE.Mesh, FxBlendingMaterial, THREE.Object3DEventMap>; +}; 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 new file mode 100644 index 00000000..fede8b0b --- /dev/null +++ b/packages/use-shader-fx/types/fxs/utils/useFxTexture/index.d.ts @@ -0,0 +1,36 @@ +import * as THREE from "three"; +import { CustomParams } from "../../../utils/setUniforms"; +import { HooksProps, HooksReturn } from "../../types"; +export type FxTextureParams = { + /** 1st texture , default : `THREE.Texture()` */ + texture0?: THREE.Texture; + /** 2nd texture , default : `THREE.Texture()` */ + texture1?: THREE.Texture; + /** add transparent padding, 0.0 ~ 1.0 , default : `0.0` */ + padding?: number; + /** The color map. The uv value is affected according to this rbg , default : `THREE.Texture()` */ + map?: THREE.Texture; + /** intensity of map , r,g value are affecting , default : `0.0` */ + mapIntensity?: number; + /** Intensity of effect on edges , default : `0.0` */ + edgeIntensity?: number; + /** epicenter of fx, -1 ~ 1 , default : `vec2(0.0,0.0)` */ + epicenter?: THREE.Vector2; + /** Switch value to switch between texture0 and texture1 , 0 ~ 1 , default : `0` */ + progress?: number; + /** direction of transition , default: `THREE.Vector2(0, 0)` */ + dir?: THREE.Vector2; +}; +export type FxTextureObject = { + scene: THREE.Scene; + mesh: THREE.Mesh; + material: THREE.Material; + camera: THREE.Camera; + renderTarget: THREE.WebGLRenderTarget; + output: THREE.Texture; +}; +export declare const FXTEXTURE_PARAMS: FxTextureParams; +/** + * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage + */ +export declare const useFxTexture: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useFxTexture/useMesh.d.ts b/packages/use-shader-fx/types/fxs/utils/useFxTexture/useMesh.d.ts new file mode 100644 index 00000000..04a6ac77 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/utils/useFxTexture/useMesh.d.ts @@ -0,0 +1,51 @@ +import * as THREE from "three"; +import { Size } from "@react-three/fiber"; +import { MaterialProps } from "../../types"; +export declare class FxTextureMaterial extends THREE.ShaderMaterial { + uniforms: { + uResolution: { + value: THREE.Vector2; + }; + uTextureResolution: { + value: THREE.Vector2; + }; + uTexture0: { + value: THREE.Texture; + }; + uTexture1: { + value: THREE.Texture; + }; + padding: { + value: number; + }; + uMap: { + value: THREE.Texture; + }; + edgeIntensity: { + value: number; + }; + mapIntensity: { + value: number; + }; + epicenter: { + value: THREE.Vector2; + }; + progress: { + value: number; + }; + dirX: { + value: number; + }; + dirY: { + value: number; + }; + }; +} +export declare const useMesh: ({ scene, size, dpr, uniforms, onBeforeCompile, }: { + scene: THREE.Scene; + size: Size; + dpr: number | false; +} & MaterialProps) => { + material: FxTextureMaterial; + mesh: THREE.Mesh, FxTextureMaterial, THREE.Object3DEventMap>; +}; 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 new file mode 100644 index 00000000..09a3b3ce --- /dev/null +++ b/packages/use-shader-fx/types/fxs/utils/useHSV/index.d.ts @@ -0,0 +1,24 @@ +import * as THREE from "three"; +import { CustomParams } from "../../../utils/setUniforms"; +import { HooksProps, HooksReturn } from "../../types"; +export type HSVParams = { + /** default : `THREE.Texture()` */ + texture?: THREE.Texture; + /** default : `1` */ + brightness?: number; + /** default : `1` */ + saturation?: number; +}; +export type HSVObject = { + scene: THREE.Scene; + mesh: THREE.Mesh; + material: THREE.Material; + camera: THREE.Camera; + renderTarget: THREE.WebGLRenderTarget; + output: THREE.Texture; +}; +export declare const HSV_PARAMS: HSVParams; +/** + * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage + */ +export declare const useHSV: ({ size, dpr, samples, isSizeUpdate, uniforms, onBeforeCompile, }: HooksProps) => HooksReturn; diff --git a/packages/use-shader-fx/types/fxs/utils/useHSV/useMesh.d.ts b/packages/use-shader-fx/types/fxs/utils/useHSV/useMesh.d.ts new file mode 100644 index 00000000..b997d952 --- /dev/null +++ b/packages/use-shader-fx/types/fxs/utils/useHSV/useMesh.d.ts @@ -0,0 +1,23 @@ +import * as THREE from "three"; +import { Size } from "@react-three/fiber"; +import { MaterialProps } from "../../types"; +export declare class HSVMaterial extends THREE.ShaderMaterial { + uniforms: { + u_texture: { + value: THREE.Texture; + }; + u_brightness: { + value: number; + }; + u_saturation: { + value: number; + }; + }; +} +export declare const useMesh: ({ scene, uniforms, onBeforeCompile, }: { + scene: THREE.Scene; + size: Size; +} & MaterialProps) => { + material: HSVMaterial; + mesh: THREE.Mesh, HSVMaterial, THREE.Object3DEventMap>; +}; diff --git a/packages/use-shader-fx/types/index.d.ts b/packages/use-shader-fx/types/index.d.ts new file mode 100644 index 00000000..f956940b --- /dev/null +++ b/packages/use-shader-fx/types/index.d.ts @@ -0,0 +1,37 @@ +export * from "./fxs/interactions/useBrush"; +export * from "./fxs/simulations/useFluid"; +export * from "./fxs/simulations/useRipple"; +export * from "./fxs/noises/useNoise"; +export * from "./fxs/noises/useColorStrata"; +export * from "./fxs/noises/useMarble"; +export * from "./fxs/noises/useCosPalette"; +export * from "./fxs/utils/useDuoTone"; +export * from "./fxs/utils/useBlending"; +export * from "./fxs/utils/useFxTexture"; +export * from "./fxs/utils/useBrightnessPicker"; +export * from "./fxs/utils/useFxBlending"; +export * from "./fxs/utils/useAlphaBlending"; +export * from "./fxs/utils/useHSV"; +export * from "./fxs/utils/useCoverTexture"; +export * from "./fxs/effects/useSimpleBlur"; +export * from "./fxs/effects/useMotionBlur"; +export * from "./fxs/effects/useWave"; +export * from "./fxs/misc/useChromaKey"; +export * from "./fxs/misc/useBlank"; +export * from "./fxs/3D/useMorphParticles"; +export * from "./fxs/3D/useMorphParticles/useCreateMorphParticles"; +export * from "./fxs/3D/useWobble3D"; +export * from "./fxs/3D/useWobble3D/useCreateWobble3D"; +export * from "./utils/setUniforms"; +export * from "./utils/useAddMesh"; +export * from "./utils/useCamera"; +export * from "./utils/useDoubleFBO"; +export * from "./utils/useParams"; +export * from "./utils/useResolution"; +export * from "./utils/useSingleFBO"; +export * from "./misc/usePointer"; +export * from "./misc/useBeat"; +export * from "./misc/useFPSLimiter"; +export * from "./misc/useDomSyncer"; +export * from "./misc/useCopyTexture"; +export * from "./libs/easing"; diff --git a/packages/use-shader-fx/types/libs/constants.d.ts b/packages/use-shader-fx/types/libs/constants.d.ts new file mode 100644 index 00000000..abd77be4 --- /dev/null +++ b/packages/use-shader-fx/types/libs/constants.d.ts @@ -0,0 +1,8 @@ +import * as THREE from "three"; +export declare const ISDEV: boolean; +export declare const MATERIAL_BASIC_PARAMS: { + transparent: boolean; + depthTest: boolean; + depthWrite: boolean; +}; +export declare const DEFAULT_TEXTURE: THREE.DataTexture; diff --git a/packages/use-shader-fx/types/libs/easing.d.ts b/packages/use-shader-fx/types/libs/easing.d.ts new file mode 100644 index 00000000..41ba49de --- /dev/null +++ b/packages/use-shader-fx/types/libs/easing.d.ts @@ -0,0 +1,9 @@ +export type EasingTypes = "easeInSine" | "easeOutSine" | "easeInOutSine" | "easeInQuad" | "easeOutQuad" | "easeInOutQuad" | "easeInCubic" | "easeOutCubic" | "easeInOutCubic" | "easeInQuart" | "easeOutQuart" | "easeInOutQuart" | "easeInQuint" | "easeOutQuint" | "easeInOutQuint" | "easeInExpo" | "easeOutExpo" | "easeInOutExpo" | "easeInCirc" | "easeOutCirc" | "easeInOutCirc" | "easeInBack" | "easeOutBack" | "easeInOutBack" | "easeInElastic" | "easeOutElastic" | "easeInOutElastic" | "easeInBounce" | "easeOutBounce" | "easeInOutBounce"; +type EasingFunctions = { + [K in EasingTypes]: (x: number) => number; +}; +/** + * from https://github.com/ai/easings.net + */ +export declare const Easing: EasingFunctions; +export {}; diff --git a/packages/use-shader-fx/types/libs/shaders/resolveShaders.d.ts b/packages/use-shader-fx/types/libs/shaders/resolveShaders.d.ts new file mode 100644 index 00000000..a2eddb55 --- /dev/null +++ b/packages/use-shader-fx/types/libs/shaders/resolveShaders.d.ts @@ -0,0 +1,2 @@ +import * as THREE from "three"; +export declare const resolveShaders: (parameters: THREE.WebGLProgramParametersWithUniforms) => void; diff --git a/packages/use-shader-fx/types/misc/useBeat.d.ts b/packages/use-shader-fx/types/misc/useBeat.d.ts new file mode 100644 index 00000000..7ec43cc6 --- /dev/null +++ b/packages/use-shader-fx/types/misc/useBeat.d.ts @@ -0,0 +1,14 @@ +import * as THREE from "three"; +import { EasingTypes } from "../libs/easing"; +type BeatValues = { + beat: number; + floor: number; + fract: number; + /** unique hash specific to the beat */ + hash: number; +}; +/** + * @param ease easing functions are referenced from https://github.com/ai/easings.net , default : "easeOutQuart" + */ +export declare const useBeat: (bpm: number, ease?: EasingTypes) => (clock: THREE.Clock) => BeatValues; +export {}; diff --git a/packages/use-shader-fx/types/misc/useCopyTexture.d.ts b/packages/use-shader-fx/types/misc/useCopyTexture.d.ts new file mode 100644 index 00000000..74bb78d5 --- /dev/null +++ b/packages/use-shader-fx/types/misc/useCopyTexture.d.ts @@ -0,0 +1,17 @@ +import * as THREE from "three"; +import { UseFboProps } from "../utils/useSingleFBO"; +type UpdateCopyFunction = (gl: THREE.WebGLRenderer, index: number, +/** call before FBO is rendered */ +onBeforeRender?: ({ read }: { + read: THREE.Texture; +}) => void) => THREE.Texture; +type UseCopyTextureReturn = [THREE.WebGLRenderTarget[], UpdateCopyFunction]; +/** + * Generate an FBO array to copy the texture. + * @param dpr If dpr is set, dpr will be multiplied, default : `false` + * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false` + * @param length The number of FBOs to create + * @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. + */ +export declare const useCopyTexture: ({ scene, camera, size, dpr, isSizeUpdate, samples, depthBuffer, depthTexture, }: UseFboProps, length: number) => UseCopyTextureReturn; +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 new file mode 100644 index 00000000..0f75ebaf --- /dev/null +++ b/packages/use-shader-fx/types/misc/useDomSyncer/index.d.ts @@ -0,0 +1,45 @@ +import * as THREE from "three"; +import { Key } from "react"; +import { HooksProps, HooksReturn } from "../../fxs/types"; +import { IsIntersecting } from "./utils/useIsIntersecting"; +import { UseDomView } from "./utils/createUseDomView"; +import { CustomParams } from "../../utils/setUniforms"; +export type DomSyncerParams = { + /** DOM array you want to synchronize */ + dom?: (HTMLElement | Element | null)[]; + /** Texture array that you want to synchronize with the DOM rectangle */ + texture?: THREE.Texture[]; + /** default : `0.0[]` */ + boderRadius?: number[]; + /** the angle you want to rotate */ + rotation?: THREE.Euler[]; + /** Array of callback functions when crossed */ + onIntersect?: ((entry: IntersectionObserverEntry) => void)[]; + /** Because DOM rendering and React updates occur asynchronously, there may be a lag between updating dependent arrays and setting DOM arrays. That's what the Key is for. If the dependent array is updated but the Key is not, the loop will skip and return an empty texture. By updating the timing key when DOM acquisition is complete, you can perfectly synchronize DOM and Mesh updates.updateKey must be a unique value for each update, for example `performance.now()`.*/ + updateKey?: Key; +}; +export type DomSyncerObject = { + scene: THREE.Scene; + camera: THREE.Camera; + renderTarget: THREE.WebGLRenderTarget; + output: THREE.Texture; + /** + * A function that returns a determination whether the DOM intersects or not. + * The boolean will be updated after executing the onIntersect function. + * @param index - Index of the dom for which you want to return an intersection decision. -1 will return the entire array. + * @param once - If set to true, it will continue to return true once crossed. + */ + isIntersecting: IsIntersecting; + /** target's DOMRect[] */ + DOMRects: DOMRect[]; + /** target's intersetions boolean[] */ + intersections: boolean[]; + /** You can set callbacks for when at least one DOM is visible and when it is completely hidden. */ + useDomView: UseDomView; +}; +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, uniforms, onBeforeCompile }: HooksProps, dependencies?: import("react").DependencyList) => HooksReturn; diff --git a/packages/use-shader-fx/types/misc/useDomSyncer/utils/createMesh.d.ts b/packages/use-shader-fx/types/misc/useDomSyncer/utils/createMesh.d.ts new file mode 100644 index 00000000..478b7e48 --- /dev/null +++ b/packages/use-shader-fx/types/misc/useDomSyncer/utils/createMesh.d.ts @@ -0,0 +1,25 @@ +import * as THREE from "three"; +import { DomSyncerParams } from "../"; +import { Size } from "@react-three/fiber"; +import { MaterialProps } from "../../../fxs/types"; +export declare class DomSyncerMaterial extends THREE.ShaderMaterial { + uniforms: { + u_texture: { + value: THREE.Texture; + }; + u_textureResolution: { + value: THREE.Vector2; + }; + u_resolution: { + value: THREE.Vector2; + }; + u_borderRadius: { + value: number; + }; + }; +} +export declare const createMesh: ({ params, scene, uniforms, onBeforeCompile, }: { + params: DomSyncerParams; + size: Size; + scene: THREE.Scene; +} & MaterialProps) => void; diff --git a/packages/use-shader-fx/types/misc/useDomSyncer/utils/createUseDomView.d.ts b/packages/use-shader-fx/types/misc/useDomSyncer/utils/createUseDomView.d.ts new file mode 100644 index 00000000..7e5535e2 --- /dev/null +++ b/packages/use-shader-fx/types/misc/useDomSyncer/utils/createUseDomView.d.ts @@ -0,0 +1,6 @@ +export type UseDomViewProps = { + onView?: () => void; + onHidden?: () => void; +}; +export type UseDomView = (props: UseDomViewProps) => void; +export declare const createUseDomView: (isIntersectingRef: React.MutableRefObject) => UseDomView; diff --git a/packages/use-shader-fx/types/misc/useDomSyncer/utils/errorHandler.d.ts b/packages/use-shader-fx/types/misc/useDomSyncer/utils/errorHandler.d.ts new file mode 100644 index 00000000..657c3b43 --- /dev/null +++ b/packages/use-shader-fx/types/misc/useDomSyncer/utils/errorHandler.d.ts @@ -0,0 +1,2 @@ +import { DomSyncerParams } from ".."; +export declare const errorHandler: (params: DomSyncerParams) => boolean; diff --git a/packages/use-shader-fx/types/misc/useDomSyncer/utils/useIntersectionHandler.d.ts b/packages/use-shader-fx/types/misc/useDomSyncer/utils/useIntersectionHandler.d.ts new file mode 100644 index 00000000..cd25a98a --- /dev/null +++ b/packages/use-shader-fx/types/misc/useDomSyncer/utils/useIntersectionHandler.d.ts @@ -0,0 +1,6 @@ +import { DomSyncerParams } from ".."; +export declare const useIntersectionHandler: () => ({ isIntersectingRef, isIntersectingOnceRef, params, }: { + isIntersectingRef: React.MutableRefObject; + isIntersectingOnceRef: React.MutableRefObject; + params: DomSyncerParams; +}) => void; diff --git a/packages/use-shader-fx/types/misc/useDomSyncer/utils/useIsIntersecting.d.ts b/packages/use-shader-fx/types/misc/useDomSyncer/utils/useIsIntersecting.d.ts new file mode 100644 index 00000000..ccc3f896 --- /dev/null +++ b/packages/use-shader-fx/types/misc/useDomSyncer/utils/useIsIntersecting.d.ts @@ -0,0 +1,7 @@ +/// +export type IsIntersecting = (index: number, once?: boolean) => boolean[] | boolean; +export declare const useIsIntersecting: () => { + isIntersectingRef: import("react").MutableRefObject; + isIntersectingOnceRef: import("react").MutableRefObject; + isIntersecting: IsIntersecting; +}; diff --git a/packages/use-shader-fx/types/misc/useDomSyncer/utils/useUpdateDomRect.d.ts b/packages/use-shader-fx/types/misc/useDomSyncer/utils/useUpdateDomRect.d.ts new file mode 100644 index 00000000..6d35df5c --- /dev/null +++ b/packages/use-shader-fx/types/misc/useDomSyncer/utils/useUpdateDomRect.d.ts @@ -0,0 +1,16 @@ +/// +import * as THREE from "three"; +import { DomSyncerParams } from ".."; +import { Size } from "@react-three/fiber"; +import { CustomParams } from "../../../utils/setUniforms"; +type UpdateDomRect = ({ params, customParams, size, resolutionRef, scene, isIntersectingRef, }: { + params: DomSyncerParams; + customParams?: CustomParams; + size: Size; + resolutionRef: React.MutableRefObject; + scene: THREE.Scene; + isIntersectingRef: React.MutableRefObject; +}) => void; +type UseUpdateDomRectReturn = [DOMRect[], UpdateDomRect]; +export declare const useUpdateDomRect: () => UseUpdateDomRectReturn; +export {}; diff --git a/packages/use-shader-fx/types/misc/useFPSLimiter.d.ts b/packages/use-shader-fx/types/misc/useFPSLimiter.d.ts new file mode 100644 index 00000000..d3433567 --- /dev/null +++ b/packages/use-shader-fx/types/misc/useFPSLimiter.d.ts @@ -0,0 +1,14 @@ +import * as THREE from "three"; +/** + * @param fps FPS you want to limit , default : `60` + * + * ```tsx + * const limiter = useFPSLimiter(fps); + * useFrame((props) => { + * if (limiter(props.clock)) { + * //some code + * } + * }); + * ``` + */ +export declare const useFPSLimiter: (fps?: number) => (clock: THREE.Clock) => boolean; diff --git a/packages/use-shader-fx/types/misc/usePointer.d.ts b/packages/use-shader-fx/types/misc/usePointer.d.ts new file mode 100644 index 00000000..3d13a115 --- /dev/null +++ b/packages/use-shader-fx/types/misc/usePointer.d.ts @@ -0,0 +1,16 @@ +import * as THREE from "three"; +export type PointerValues = { + currentPointer: THREE.Vector2; + prevPointer: THREE.Vector2; + diffPointer: THREE.Vector2; + velocity: THREE.Vector2; + isVelocityUpdate: boolean; +}; +type UpdatePointer = (currentPointer: THREE.Vector2) => PointerValues; +/** + * @description When given the pointer vector2 from r3f's RootState, it generates an update function that returns {`currentPointer`, `prevPointer`, `diffPointer`, `isVelocityUpdate`, `velocity`}. + * @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`. + * @param lerp 0~1, lerp intensity (0 to less than 1) , default : `0` + */ +export declare const usePointer: (lerp?: number) => UpdatePointer; +export {}; diff --git a/packages/use-shader-fx/types/utils/getDpr.d.ts b/packages/use-shader-fx/types/utils/getDpr.d.ts new file mode 100644 index 00000000..fb38dcca --- /dev/null +++ b/packages/use-shader-fx/types/utils/getDpr.d.ts @@ -0,0 +1,5 @@ +import { Dpr } from "../fxs/types"; +export declare const getDpr: (dpr: Dpr) => { + shader: number | false; + fbo: number | false; +}; diff --git a/packages/use-shader-fx/types/utils/setOnBeforeCompile.d.ts b/packages/use-shader-fx/types/utils/setOnBeforeCompile.d.ts new file mode 100644 index 00000000..5445ec1c --- /dev/null +++ b/packages/use-shader-fx/types/utils/setOnBeforeCompile.d.ts @@ -0,0 +1,4 @@ +import * as THREE from "three"; +type OnBeforeCompile = (parameters: THREE.WebGLProgramParametersWithUniforms, renderer: THREE.WebGLRenderer) => void; +export declare const setOnBeforeCompile: (onBeforeCompile?: OnBeforeCompile) => OnBeforeCompile; +export {}; diff --git a/packages/use-shader-fx/types/utils/setUniforms.d.ts b/packages/use-shader-fx/types/utils/setUniforms.d.ts new file mode 100644 index 00000000..306c48b8 --- /dev/null +++ b/packages/use-shader-fx/types/utils/setUniforms.d.ts @@ -0,0 +1,17 @@ +import * as THREE from "three"; +type UniformValue = THREE.CubeTexture | THREE.Texture | Int32Array | Float32Array | THREE.Matrix4 | THREE.Matrix3 | THREE.Quaternion | THREE.Vector4 | THREE.Vector3 | THREE.Vector2 | THREE.Color | number | boolean | Array | null | undefined; +type UniformObject = { + [key: string]: { + value: UniformValue; + }; +}; +export declare const setUniform: (material: { + uniforms: T; +}) => (key: keyof T, value: UniformValue) => void; +export type CustomParams = { + [uniform: string]: UniformValue; +}; +export declare const setCustomUniform: (material: { + uniforms: UniformObject; +}) => (customParams: CustomParams | undefined) => void; +export {}; diff --git a/packages/use-shader-fx/types/utils/useAddMesh.d.ts b/packages/use-shader-fx/types/utils/useAddMesh.d.ts new file mode 100644 index 00000000..e00d3d01 --- /dev/null +++ b/packages/use-shader-fx/types/utils/useAddMesh.d.ts @@ -0,0 +1,3 @@ +import * as THREE from "three"; +/** Generate mesh from geometry and material and add to scene */ +export declare const useAddMesh: (scene: THREE.Scene, geometry: THREE.BufferGeometry, material: THREE.Material) => THREE.Mesh, THREE.Material, THREE.Object3DEventMap>; diff --git a/packages/use-shader-fx/types/utils/useAddObject.d.ts b/packages/use-shader-fx/types/utils/useAddObject.d.ts new file mode 100644 index 00000000..99a407f6 --- /dev/null +++ b/packages/use-shader-fx/types/utils/useAddObject.d.ts @@ -0,0 +1,7 @@ +import * as THREE from "three"; +type Object3DConstructor = new (geometry: THREE.BufferGeometry, material: M) => T; +/** + * Add geometry and material to Object3D and add them to scene. + */ +export declare const useAddObject: , M extends THREE.Material>(scene: THREE.Scene | false, geometry: THREE.BufferGeometry, material: M, Proto: Object3DConstructor) => T; +export {}; diff --git a/packages/use-shader-fx/types/utils/useCamera.d.ts b/packages/use-shader-fx/types/utils/useCamera.d.ts new file mode 100644 index 00000000..39e93263 --- /dev/null +++ b/packages/use-shader-fx/types/utils/useCamera.d.ts @@ -0,0 +1,3 @@ +import * as THREE from "three"; +import { Size } from "@react-three/fiber"; +export declare const useCamera: (size: Size, cameraType?: "OrthographicCamera" | "PerspectiveCamera") => THREE.OrthographicCamera | THREE.PerspectiveCamera; diff --git a/packages/use-shader-fx/types/utils/useDoubleFBO.d.ts b/packages/use-shader-fx/types/utils/useDoubleFBO.d.ts new file mode 100644 index 00000000..b737bdf8 --- /dev/null +++ b/packages/use-shader-fx/types/utils/useDoubleFBO.d.ts @@ -0,0 +1,26 @@ +import * as THREE from "three"; +import { UseFboProps } from "./useSingleFBO"; +export type DoubleRenderTarget = { + read: THREE.WebGLRenderTarget | null; + write: THREE.WebGLRenderTarget | null; +}; +type FBOUpdateFunction = (gl: THREE.WebGLRenderer, +/** call before FBO is rendered */ +onBeforeRender?: ({ read, write, }: { + read: THREE.Texture; + write: THREE.Texture; +}) => void) => THREE.Texture; +type UseDoubleFBOReturn = [ + { + read: THREE.WebGLRenderTarget; + write: THREE.WebGLRenderTarget; + }, + FBOUpdateFunction +]; +/** + * @param dpr If dpr is set, dpr will be multiplied, default : `false` + * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false` + * @returns [{read:THREE.WebGLRenderTarget,write:THREE.WebGLRenderTarget} , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument. + */ +export declare const useDoubleFBO: ({ scene, camera, size, dpr, isSizeUpdate, samples, depthBuffer, depthTexture, }: UseFboProps) => UseDoubleFBOReturn; +export {}; diff --git a/packages/use-shader-fx/types/utils/useParams.d.ts b/packages/use-shader-fx/types/utils/useParams.d.ts new file mode 100644 index 00000000..012d0b59 --- /dev/null +++ b/packages/use-shader-fx/types/utils/useParams.d.ts @@ -0,0 +1,7 @@ +type SetParams = (newParams?: Partial) => void; +type UseParamsReturn = [T, SetParams]; +/** + * @param params Receives an initial value object. With structuredClone, deep copy and set, but if the object contains a function, just set it. + */ +export declare const useParams: (params: T) => UseParamsReturn; +export {}; diff --git a/packages/use-shader-fx/types/utils/useResolution.d.ts b/packages/use-shader-fx/types/utils/useResolution.d.ts new file mode 100644 index 00000000..7216df87 --- /dev/null +++ b/packages/use-shader-fx/types/utils/useResolution.d.ts @@ -0,0 +1,6 @@ +import * as THREE from "three"; +import { Size } from "@react-three/fiber"; +/** + * @params dpr if dpr is set, it returns the resolution which is size multiplied by dpr. + */ +export declare const useResolution: (size: Size, dpr?: number | false) => THREE.Vector2; diff --git a/packages/use-shader-fx/types/utils/useSingleFBO.d.ts b/packages/use-shader-fx/types/utils/useSingleFBO.d.ts new file mode 100644 index 00000000..f9d25d9d --- /dev/null +++ b/packages/use-shader-fx/types/utils/useSingleFBO.d.ts @@ -0,0 +1,39 @@ +import * as THREE from "three"; +import { Size } from "@react-three/fiber"; +export declare const FBO_OPTION: THREE.RenderTargetOptions; +export type UseFboProps = { + scene: THREE.Scene; + camera: THREE.Camera; + size: Size; + /** If dpr is set, dpr will be multiplied, default : `false` */ + dpr?: number | false; + /** Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false` */ + isSizeUpdate?: boolean; + /** Defines the count of MSAA samples. Can only be used with WebGL 2. default : `0.0` */ + samples?: number; + /** Renders to the depth buffer. Unlike the three.js, default : `false` */ + depthBuffer?: boolean; + /** If set, the scene depth will be rendered to this texture. default : `false` */ + depthTexture?: boolean; +}; +export declare const renderFBO: ({ gl, fbo, scene, camera, onBeforeRender, onSwap, }: { + gl: THREE.WebGLRenderer; + fbo: THREE.WebGLRenderTarget; + scene: THREE.Scene; + camera: THREE.Camera; + onBeforeRender: () => void; + onSwap?: (() => void) | undefined; +}) => void; +type UpdateRenderTarget = (gl: THREE.WebGLRenderer, +/** call before FBO is rendered */ +onBeforeRender?: ({ read }: { + read: THREE.Texture; +}) => void) => THREE.Texture; +type UseSingleFBOReturn = [THREE.WebGLRenderTarget, UpdateRenderTarget]; +/** + * @param dpr If dpr is set, dpr will be multiplied, default:false + * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false + * @returns [THREE.WebGLRenderTarget , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument. + */ +export declare const useSingleFBO: ({ scene, camera, size, dpr, isSizeUpdate, samples, depthBuffer, depthTexture, }: UseFboProps) => UseSingleFBOReturn; +export {}; From 29b0cc574023aa7f8a17bb6897d59c33964a9d9e Mon Sep 17 00:00:00 2001 From: takuma-hmng8 Date: Mon, 13 May 2024 14:34:02 +0900 Subject: [PATCH 3/3] fix:types --- app/_home/Playground.tsx | 23 +- packages/use-shader-fx/build/use-shader-fx.js | 486 +++++++++--------- .../use-shader-fx/build/use-shader-fx.js.map | 2 +- .../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/useWobble3D/useMaterial.ts | 30 +- .../types/fxs/3D/useWobble3D/useMaterial.d.ts | 6 +- 8 files changed, 279 insertions(+), 276 deletions(-) diff --git a/app/_home/Playground.tsx b/app/_home/Playground.tsx index f689d1a9..a8b802fc 100644 --- a/app/_home/Playground.tsx +++ b/app/_home/Playground.tsx @@ -112,10 +112,11 @@ export const Playground = ({ }), [hsv, marble] ), - onBeforeCompile: useCallback((shader: any) => { - shader.fragmentShader = shader.fragmentShader.replace( - "#usf ", - ` + onBeforeCompile: useCallback( + (shader: THREE.WebGLProgramParametersWithUniforms) => { + shader.fragmentShader = shader.fragmentShader.replace( + "#usf ", + ` uniform sampler2D u_noise; uniform float u_noiseIntensity; uniform sampler2D u_colorStrata; @@ -123,10 +124,10 @@ export const Playground = ({ return fract(sin(dot(n ,vec2(12.9898,78.233))) * 43758.5453); } ` - ); - shader.fragmentShader = shader.fragmentShader.replace( - "#usf
", - ` + ); + shader.fragmentShader = shader.fragmentShader.replace( + "#usf
", + ` vec2 uv = vUv; float grain=rand(uv+sin(uTime))*.4; grain=grain*.5+.5; @@ -135,8 +136,10 @@ export const Playground = ({ vec4 colorStrata = texture2D(u_colorStrata,uv); usf_FragColor = colorStrata*grain; ` - ); - }, []), + ); + }, + [] + ), }); // set fxs diff --git a/packages/use-shader-fx/build/use-shader-fx.js b/packages/use-shader-fx/build/use-shader-fx.js index 4895662b..d85d250d 100644 --- a/packages/use-shader-fx/build/use-shader-fx.js +++ b/packages/use-shader-fx/build/use-shader-fx.js @@ -350,7 +350,7 @@ const He = (e) => { onBeforeCompile: i }) => { const v = b(() => new a.PlaneGeometry(2, 2), []), s = b(() => { - const d = new a.ShaderMaterial({ + const f = new a.ShaderMaterial({ uniforms: { uBuffer: { value: T }, uResolution: { value: new a.Vector2(0, 0) }, @@ -379,7 +379,7 @@ const He = (e) => { // Must be transparent transparent: !0 }); - return d.onBeforeCompile = V(i), d; + return f.onBeforeCompile = V(i), f; }, [i, r]), u = Y(t, n); A(s)("uResolution", u.clone()); const c = $(e, v, s, a.Mesh); @@ -404,19 +404,19 @@ const He = (e) => { const t = L(new a.Vector2(0, 0)), n = L(new a.Vector2(0, 0)), r = L(new a.Vector2(0, 0)), i = L(0), v = L(new a.Vector2(0, 0)), s = L(!1); return D( (c) => { - const d = performance.now(); - let f; + const f = performance.now(); + let d; s.current && e ? (r.current = r.current.lerp( c, 1 - e - ), f = r.current.clone()) : (f = c.clone(), r.current = f), i.current === 0 && (i.current = d, t.current = f); - const y = Math.max(1, d - i.current); - i.current = d, v.current.copy(f).sub(t.current).divideScalar(y); - const x = v.current.length() > 0, o = s.current ? t.current.clone() : f; - return !s.current && x && (s.current = !0), t.current = f, { - currentPointer: f, + ), d = r.current.clone()) : (d = c.clone(), r.current = d), i.current === 0 && (i.current = f, t.current = d); + const y = Math.max(1, f - i.current); + i.current = f, v.current.copy(d).sub(t.current).divideScalar(y); + const x = v.current.length() > 0, o = s.current ? t.current.clone() : d; + return !s.current && x && (s.current = !0), t.current = d, { + currentPointer: d, prevPointer: o, - diffPointer: n.current.subVectors(f, o), + diffPointer: n.current.subVectors(d, o), velocity: v.current, isVelocityUpdate: x }; @@ -465,12 +465,12 @@ const He = (e) => { depthTexture: u = !1 }) => { var y; - const c = L(), d = Y(n, r); + const c = L(), f = Y(n, r); c.current = b( () => { const x = new a.WebGLRenderTarget( - d.x, - d.y, + f.x, + f.y, { ...he, samples: v, @@ -478,20 +478,20 @@ const He = (e) => { } ); return u && (x.depthTexture = new a.DepthTexture( - d.x, - d.y, + f.x, + f.y, a.FloatType )), x; }, // eslint-disable-next-line react-hooks/exhaustive-deps [] - ), i && ((y = c.current) == null || y.setSize(d.x, d.y)), ae(() => { + ), i && ((y = c.current) == null || y.setSize(f.x, f.y)), ae(() => { const x = c.current; return () => { x == null || x.dispose(); }; }, []); - const f = D( + const d = D( (x, o) => { const g = c.current; return Ce({ @@ -504,7 +504,7 @@ const He = (e) => { }, [e, t] ); - return [c.current, f]; + return [c.current, d]; }, se = ({ scene: e, camera: t, @@ -523,27 +523,27 @@ const He = (e) => { let g = this.read; this.read = this.write, this.write = g; } - }), d = Y(n, r), f = b(() => { - const g = new a.WebGLRenderTarget(d.x, d.y, { + }), f = Y(n, r), d = b(() => { + const g = new a.WebGLRenderTarget(f.x, f.y, { ...he, samples: v, depthBuffer: s - }), l = new a.WebGLRenderTarget(d.x, d.y, { + }), l = new a.WebGLRenderTarget(f.x, f.y, { ...he, samples: v, depthBuffer: s }); return u && (g.depthTexture = new a.DepthTexture( - d.x, - d.y, + f.x, + f.y, a.FloatType ), l.depthTexture = new a.DepthTexture( - d.x, - d.y, + f.x, + f.y, a.FloatType )), { read: g, write: l }; }, []); - c.current.read = f.read, c.current.write = f.write, i && ((x = c.current.read) == null || x.setSize(d.x, d.y), (o = c.current.write) == null || o.setSize(d.x, d.y)), ae(() => { + c.current.read = d.read, c.current.write = d.write, i && ((x = c.current.read) == null || x.setSize(f.x, f.y), (o = c.current.write) == null || o.setSize(f.x, f.y)), ae(() => { const g = c.current; return () => { var l, p; @@ -596,15 +596,15 @@ const He = (e) => { uniforms: i, onBeforeCompile: v }) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = Ye({ + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: f } = Ye({ scene: u, size: e, dpr: s.shader, uniforms: i, onBeforeCompile: v - }), f = j(e), y = _e(), [x, o] = se({ + }), d = j(e), y = _e(), [x, o] = se({ scene: u, - camera: f, + camera: d, size: e, dpr: s.fbo, samples: n, @@ -632,9 +632,9 @@ const He = (e) => { M, { scene: u, - mesh: d, + mesh: f, material: c, - camera: f, + camera: d, renderTarget: x, output: x.read.texture } @@ -907,7 +907,7 @@ const mt = ({ }); return r.onBeforeCompile = V(e), r; }, [e, t]); -var ft = `precision highp float; +var dt = `precision highp float; varying vec2 vUv; uniform sampler2D uTarget; @@ -924,7 +924,7 @@ void main () { vec3 base = texture2D(uTarget, vUv).xyz; gl_FragColor = vec4(base + splat, 1.0); }`; -const dt = ({ +const ft = ({ onBeforeCompile: e, uniforms: t }) => b(() => { @@ -939,7 +939,7 @@ const dt = ({ ...t }, vertexShader: ee, - fragmentShader: ft, + fragmentShader: dt, ...B }); return r.onBeforeCompile = V(e), r; @@ -954,17 +954,17 @@ const dt = ({ vorticity: s, advection: u, divergence: c, - pressure: d, - clear: f, + pressure: f, + clear: d, gradientSubtract: y, splat: x } = r ?? {}, o = Q(Je), g = o.clone(), l = Q(ut, v), p = Q(lt, s), m = Q(tt, u), C = Q( rt, c - ), M = Q(at, d), h = Q(vt, f), S = Q( + ), M = Q(at, f), h = Q(vt, d), S = Q( mt, y - ), _ = Q(dt, x), w = b( + ), _ = Q(ft, x), w = b( () => ({ vorticityMaterial: p, curlMaterial: l, @@ -1028,21 +1028,21 @@ const dt = ({ isSizeUpdate: r, customFluidProps: i }) => { - const v = U(t), s = b(() => new a.Scene(), []), { materials: u, setMeshMaterial: c, mesh: d } = gt({ + const v = U(t), s = b(() => new a.Scene(), []), { materials: u, setMeshMaterial: c, mesh: f } = gt({ scene: s, size: e, dpr: v.shader, customFluidProps: i - }), f = j(e), y = _e(), x = b( + }), d = j(e), y = _e(), x = b( () => ({ scene: s, - camera: f, + camera: d, dpr: v.fbo, size: e, samples: n, isSizeUpdate: r }), - [s, f, e, n, v.fbo, r] + [s, d, e, n, v.fbo, r] ), [o, g] = se(x), [l, p] = se(x), [m, C] = W(x), [M, h] = W(x), [S, _] = se(x), w = L(new a.Vector2(0, 0)), I = L(new a.Vector3(0, 0, 0)), [R, F] = q(ht), P = b( () => ({ advection: A(u.advectionMaterial), @@ -1145,9 +1145,9 @@ const dt = ({ k, { scene: s, - mesh: d, + mesh: f, materials: u, - camera: f, + camera: d, renderTarget: { velocity: o, density: l, @@ -1200,18 +1200,18 @@ const bt = ({ // Must be transparent. transparent: !0 }), [n, i]), c = b(() => { - const d = []; - for (let f = 0; f < t; f++) { + const f = []; + for (let d = 0; d < t; d++) { const y = u.clone(); y.onBeforeCompile = V(v); const x = new a.Mesh(s.clone(), y); - x.rotateZ(2 * Math.PI * Math.random()), x.visible = !1, r.add(x), d.push(x); + x.rotateZ(2 * Math.PI * Math.random()), x.visible = !1, r.add(x), f.push(x); } - return d; + return f; }, [v, s, u, r, t]); return ae(() => () => { - c.forEach((d) => { - d.geometry.dispose(), Array.isArray(d.material) ? d.material.forEach((f) => f.dispose()) : d.material.dispose(), r.remove(d); + c.forEach((f) => { + f.geometry.dispose(), Array.isArray(f.material) ? f.material.forEach((d) => d.dispose()) : f.material.dispose(), r.remove(f); }); }, [r, c]), c; }, Mt = Object.freeze({ @@ -1232,18 +1232,18 @@ const bt = ({ uniforms: u, onBeforeCompile: c }) => { - const d = U(i), f = b(() => new a.Scene(), []), y = bt({ + const f = U(i), d = b(() => new a.Scene(), []), y = bt({ scale: t, max: n, texture: e, - scene: f, + scene: d, uniforms: u, onBeforeCompile: c }), x = j(r), o = _e(), [g, l] = W({ - scene: f, + scene: d, camera: x, size: r, - dpr: d.fbo, + dpr: f.fbo, samples: v, isSizeUpdate: s }), [p, m] = q(Mt), C = L(0), M = b(() => (S, _) => { @@ -1280,7 +1280,7 @@ const bt = ({ ), M, { - scene: f, + scene: d, camera: x, meshArr: y, renderTarget: g, @@ -1404,9 +1404,9 @@ const Ct = ({ uniforms: i, onBeforeCompile: v }) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = Ct({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), [y, x] = W({ + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: f } = Ct({ scene: u, uniforms: i, onBeforeCompile: v }), d = j(e), [y, x] = W({ scene: u, - camera: f, + camera: d, size: e, dpr: s.fbo, samples: n, @@ -1428,9 +1428,9 @@ const Ct = ({ m, { scene: u, - mesh: d, + mesh: f, material: c, - camera: f, + camera: d, renderTarget: y, output: y.texture } @@ -1529,9 +1529,9 @@ const Dt = ({ uniforms: i, onBeforeCompile: v }) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = Dt({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), [y, x] = W({ + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: f } = Dt({ scene: u, uniforms: i, onBeforeCompile: v }), d = j(e), [y, x] = W({ scene: u, - camera: f, + camera: d, size: e, dpr: s.fbo, samples: n, @@ -1553,9 +1553,9 @@ const Dt = ({ m, { scene: u, - mesh: d, + mesh: f, material: c, - camera: f, + camera: d, renderTarget: y, output: y.texture } @@ -1629,9 +1629,9 @@ const At = ({ uniforms: i, onBeforeCompile: v }) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = At({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), [y, x] = W({ + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: f } = At({ scene: u, uniforms: i, onBeforeCompile: v }), d = j(e), [y, x] = W({ scene: u, - camera: f, + camera: d, size: e, dpr: s.fbo, samples: n, @@ -1653,9 +1653,9 @@ const At = ({ m, { scene: u, - mesh: d, + mesh: f, material: c, - camera: f, + camera: d, renderTarget: y, output: y.texture } @@ -1729,9 +1729,9 @@ const Vt = ({ uniforms: i, onBeforeCompile: v }) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = Vt({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), [y, x] = W({ + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: f } = Vt({ scene: u, uniforms: i, onBeforeCompile: v }), d = j(e), [y, x] = W({ scene: u, - camera: f, + camera: d, size: e, dpr: s.fbo, samples: n, @@ -1753,9 +1753,9 @@ const Vt = ({ m, { scene: u, - mesh: d, + mesh: f, material: c, - camera: f, + camera: d, renderTarget: y, output: y.texture } @@ -1808,9 +1808,9 @@ const Ot = ({ uniforms: i, onBeforeCompile: v }) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = Ot({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), [y, x] = W({ + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: f } = Ot({ scene: u, uniforms: i, onBeforeCompile: v }), d = j(e), [y, x] = W({ scene: u, - camera: f, + camera: d, size: e, dpr: s.fbo, samples: n, @@ -1832,9 +1832,9 @@ const Ot = ({ m, { scene: u, - mesh: d, + mesh: f, material: c, - camera: f, + camera: d, renderTarget: y, output: y.texture } @@ -1919,9 +1919,9 @@ const Lt = ({ uniforms: i, onBeforeCompile: v }) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = Lt({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), [y, x] = W({ + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: f } = Lt({ scene: u, uniforms: i, onBeforeCompile: v }), d = j(e), [y, x] = W({ scene: u, - camera: f, + camera: d, size: e, dpr: s.fbo, samples: n, @@ -1943,9 +1943,9 @@ const Lt = ({ m, { scene: u, - mesh: d, + mesh: f, material: c, - camera: f, + camera: d, renderTarget: y, output: y.texture } @@ -2020,8 +2020,8 @@ const qt = ({ onBeforeCompile: i }) => { const v = b(() => new a.PlaneGeometry(2, 2), []), s = b(() => { - var f, y; - const d = new a.ShaderMaterial({ + var d, y; + const f = new a.ShaderMaterial({ uniforms: { uResolution: { value: new a.Vector2() }, uTextureResolution: { value: new a.Vector2() }, @@ -2033,7 +2033,7 @@ const qt = ({ mapIntensity: { value: oe.mapIntensity }, epicenter: { value: oe.epicenter }, progress: { value: oe.progress }, - dirX: { value: (f = oe.dir) == null ? void 0 : f.x }, + dirX: { value: (d = oe.dir) == null ? void 0 : d.x }, dirY: { value: (y = oe.dir) == null ? void 0 : y.y }, ...r }, @@ -2041,7 +2041,7 @@ const qt = ({ fragmentShader: jt, ...B }); - return d.onBeforeCompile = V(i), d; + return f.onBeforeCompile = V(i), f; }, [i, r]), u = Y(t, n); A(s)("uResolution", u.clone()); const c = $(e, v, s, a.Mesh); @@ -2064,15 +2064,15 @@ const qt = ({ uniforms: i, onBeforeCompile: v }) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = qt({ + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: f } = qt({ scene: u, size: e, dpr: s.shader, uniforms: i, onBeforeCompile: v - }), f = j(e), [y, x] = W({ + }), d = j(e), [y, x] = W({ scene: u, - camera: f, + camera: d, dpr: s.fbo, size: e, samples: n, @@ -2103,9 +2103,9 @@ const qt = ({ m, { scene: u, - mesh: d, + mesh: f, material: c, - camera: f, + camera: d, renderTarget: y, output: y.texture } @@ -2135,9 +2135,9 @@ const kt = ({ const s = new a.ShaderMaterial({ uniforms: { u_texture: { value: T }, - u_brightness: { value: fe.brightness }, - u_min: { value: fe.min }, - u_max: { value: fe.max }, + u_brightness: { value: de.brightness }, + u_min: { value: de.min }, + u_max: { value: de.max }, ...t }, vertexShader: Wt, @@ -2147,7 +2147,7 @@ const kt = ({ return s.onBeforeCompile = V(n), s; }, [n, t]), v = $(e, r, i, a.Mesh); return { material: i, mesh: v }; -}, fe = Object.freeze({ +}, de = Object.freeze({ texture: T, brightness: new a.Vector3(0.5, 0.5, 0.5), min: 0, @@ -2160,15 +2160,15 @@ const kt = ({ uniforms: i, onBeforeCompile: v }) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = kt({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), [y, x] = W({ + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: f } = kt({ scene: u, uniforms: i, onBeforeCompile: v }), d = j(e), [y, x] = W({ scene: u, - camera: f, + camera: d, size: e, dpr: s.fbo, samples: n, isSizeUpdate: r }), [o, g] = q( - fe + de ), l = A(c), p = z(c), m = D( (M, h) => { g(M), p(h); @@ -2186,9 +2186,9 @@ const kt = ({ m, { scene: u, - mesh: d, + mesh: f, material: c, - camera: f, + camera: d, renderTarget: y, output: y.texture } @@ -2240,9 +2240,9 @@ const Xt = ({ uniforms: i, onBeforeCompile: v }) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = Xt({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), [y, x] = W({ + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: f } = Xt({ scene: u, uniforms: i, onBeforeCompile: v }), d = j(e), [y, x] = W({ scene: u, - camera: f, + camera: d, size: e, dpr: s.fbo, samples: n, @@ -2264,9 +2264,9 @@ const Xt = ({ m, { scene: u, - mesh: d, + mesh: f, material: c, - camera: f, + camera: d, renderTarget: y, output: y.texture } @@ -2315,14 +2315,14 @@ const Qt = ({ uniforms: i, onBeforeCompile: v }) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = Qt({ + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: f } = Qt({ scene: u, size: e, uniforms: i, onBeforeCompile: v - }), f = j(e), [y, x] = W({ + }), d = j(e), [y, x] = W({ scene: u, - camera: f, + camera: d, size: e, dpr: s.fbo, samples: n, @@ -2344,9 +2344,9 @@ const Qt = ({ m, { scene: u, - mesh: d, + mesh: f, material: c, - camera: f, + camera: d, renderTarget: y, output: y.texture } @@ -2417,14 +2417,14 @@ const tn = ({ uniforms: i, onBeforeCompile: v }) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = tn({ + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: f } = tn({ scene: u, size: e, uniforms: i, onBeforeCompile: v - }), f = j(e), [y, x] = W({ + }), d = j(e), [y, x] = W({ scene: u, - camera: f, + camera: d, size: e, dpr: s.fbo, samples: n, @@ -2446,9 +2446,9 @@ const tn = ({ m, { scene: u, - mesh: d, + mesh: f, material: c, - camera: f, + camera: d, renderTarget: y, output: y.texture } @@ -2474,7 +2474,7 @@ const on = ({ onBeforeCompile: i }) => { const v = b(() => new a.PlaneGeometry(2, 2), []), s = b(() => { - const d = new a.ShaderMaterial({ + const f = new a.ShaderMaterial({ uniforms: { uResolution: { value: new a.Vector2() }, uTextureResolution: { value: new a.Vector2() }, @@ -2485,7 +2485,7 @@ const on = ({ fragmentShader: rn, ...B }); - return d.onBeforeCompile = V(i), d; + return f.onBeforeCompile = V(i), f; }, [i, r]), u = Y(t, n); A(s)("uResolution", u.clone()); const c = $(e, v, s, a.Mesh); @@ -2500,15 +2500,15 @@ const on = ({ uniforms: i, onBeforeCompile: v }) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = on({ + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: f } = on({ scene: u, size: e, dpr: s.shader, uniforms: i, onBeforeCompile: v - }), f = j(e), [y, x] = W({ + }), d = j(e), [y, x] = W({ scene: u, - camera: f, + camera: d, dpr: s.fbo, size: e, samples: n, @@ -2534,9 +2534,9 @@ const on = ({ m, { scene: u, - mesh: d, + mesh: f, material: c, - camera: f, + camera: d, renderTarget: y, output: y.texture } @@ -2600,16 +2600,16 @@ const ln = ({ uniforms: i, onBeforeCompile: v }) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = ln({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), y = b( + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: f } = ln({ scene: u, uniforms: i, onBeforeCompile: v }), d = j(e), y = b( () => ({ scene: u, - camera: f, + camera: d, size: e, dpr: s.fbo, samples: n, isSizeUpdate: r }), - [u, f, e, s.fbo, n, r] + [u, d, e, s.fbo, n, r] ), [x, o] = se(y), [g, l] = q(ze), p = A(c), m = z(c), C = D( (h, S) => { l(h), m(S); @@ -2636,9 +2636,9 @@ const ln = ({ C, { scene: u, - mesh: d, + mesh: f, material: c, - camera: f, + camera: d, renderTarget: x, output: x.read.texture } @@ -2670,9 +2670,9 @@ const pn = ({ uniforms: { uTexture: { value: T }, uBackbuffer: { value: T }, - uBegin: { value: de.begin }, - uEnd: { value: de.end }, - uStrength: { value: de.strength }, + uBegin: { value: fe.begin }, + uEnd: { value: fe.end }, + uStrength: { value: fe.strength }, ...t }, vertexShader: cn, @@ -2682,7 +2682,7 @@ const pn = ({ return s.onBeforeCompile = V(n), s; }, [n, t]), v = $(e, r, i, a.Mesh); return { material: i, mesh: v }; -}, de = Object.freeze({ +}, fe = Object.freeze({ texture: T, begin: new a.Vector2(0, 0), end: new a.Vector2(0, 0), @@ -2695,17 +2695,17 @@ const pn = ({ uniforms: i, onBeforeCompile: v }) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = pn({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), y = b( + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: f } = pn({ scene: u, uniforms: i, onBeforeCompile: v }), d = j(e), y = b( () => ({ scene: u, - camera: f, + camera: d, size: e, dpr: s.fbo, samples: n, isSizeUpdate: r }), - [u, f, e, s.fbo, n, r] - ), [x, o] = se(y), [g, l] = q(de), p = A(c), m = z(c), C = D( + [u, d, e, s.fbo, n, r] + ), [x, o] = se(y), [g, l] = q(fe), p = A(c), m = z(c), C = D( (h, S) => { l(h), m(S); }, @@ -2724,15 +2724,15 @@ const pn = ({ C, { scene: u, - mesh: d, + mesh: f, material: c, - camera: f, + camera: d, renderTarget: x, output: x.read.texture } ]; }; -var mn = "#usf ", fn = `precision highp float; +var mn = "#usf ", dn = `precision highp float; varying vec2 vUv; uniform float uProgress; @@ -2782,7 +2782,7 @@ void main() { gl_FragColor = vec4(color, 1.0); }`; -const dn = ({ +const fn = ({ scene: e, uniforms: t, onBeforeCompile: n @@ -2798,7 +2798,7 @@ const dn = ({ ...t }, vertexShader: mn, - fragmentShader: fn, + fragmentShader: dn, ...B }); return s.onBeforeCompile = V(n), s; @@ -2818,9 +2818,9 @@ const dn = ({ uniforms: i, onBeforeCompile: v }) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = dn({ scene: u, uniforms: i, onBeforeCompile: v }), f = j(e), [y, x] = W({ + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: f } = fn({ scene: u, uniforms: i, onBeforeCompile: v }), d = j(e), [y, x] = W({ scene: u, - camera: f, + camera: d, size: e, dpr: s.fbo, samples: n, @@ -2845,9 +2845,9 @@ const dn = ({ m, { scene: u, - mesh: d, + mesh: f, material: c, - camera: f, + camera: d, renderTarget: y, output: y.texture } @@ -2930,7 +2930,7 @@ const xn = ({ onBeforeCompile: i }) => { const v = b(() => new a.PlaneGeometry(2, 2), []), s = b(() => { - const d = new a.ShaderMaterial({ + const f = new a.ShaderMaterial({ uniforms: { u_texture: { value: T }, u_resolution: { value: new a.Vector2() }, @@ -2948,7 +2948,7 @@ const xn = ({ fragmentShader: hn, ...B }); - return d.onBeforeCompile = V(i), d; + return f.onBeforeCompile = V(i), f; }, [i, r]), u = Y(t, n); A(s)("u_resolution", u.clone()); const c = $(e, v, s, a.Mesh); @@ -2971,15 +2971,15 @@ const xn = ({ uniforms: i, onBeforeCompile: v }) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = xn({ + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: f } = xn({ scene: u, size: e, dpr: s.shader, uniforms: i, onBeforeCompile: v - }), f = j(e), [y, x] = W({ + }), d = j(e), [y, x] = W({ scene: u, - camera: f, + camera: d, size: e, dpr: s.fbo, samples: n, @@ -3001,9 +3001,9 @@ const xn = ({ m, { scene: u, - mesh: d, + mesh: f, material: c, - camera: f, + camera: d, renderTarget: y, output: y.texture } @@ -3051,7 +3051,7 @@ const Mn = ({ onBeforeCompile: i }) => { const v = b(() => new a.PlaneGeometry(2, 2), []), s = b(() => { - const d = new a.ShaderMaterial({ + const f = new a.ShaderMaterial({ uniforms: { uTexture: { value: T }, uBackbuffer: { value: T }, @@ -3064,7 +3064,7 @@ const Mn = ({ fragmentShader: bn, ...B }); - return d.onBeforeCompile = V(i), d; + return f.onBeforeCompile = V(i), f; }, [i, r]), u = Y(t, n); A(s)("uResolution", u.clone()); const c = $(e, v, s, a.Mesh); @@ -3080,22 +3080,22 @@ const Mn = ({ uniforms: i, onBeforeCompile: v }) => { - const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: d } = Mn({ + const s = U(t), u = b(() => new a.Scene(), []), { material: c, mesh: f } = Mn({ scene: u, size: e, dpr: s.shader, uniforms: i, onBeforeCompile: v - }), f = j(e), y = b( + }), d = j(e), y = b( () => ({ scene: u, - camera: f, + camera: d, size: e, dpr: s.fbo, samples: n, isSizeUpdate: r }), - [u, f, e, s.fbo, n, r] + [u, d, e, s.fbo, n, r] ), [x, o] = se(y), [g, l] = q(Sn), p = A(c), m = z(c), C = D( (h, S) => { l(h), m(S); @@ -3115,9 +3115,9 @@ const Mn = ({ C, { scene: u, - mesh: d, + mesh: f, material: c, - camera: f, + camera: d, renderTarget: x, output: x.read.texture } @@ -3290,8 +3290,8 @@ void main() { gl_FragColor = vec4(finalColor,alpha * vPictureAlpha * alphaMap * mapColor.a * uPointAlpha); }`; const Pe = (e, t, n, r, i) => { - var f; - const v = n === "position" ? "positionTarget" : "uvTarget", s = n === "position" ? "#usf " : "#usf ", u = n === "position" ? "#usf " : "#usf ", c = n === "position" ? "positionsList" : "uvsList", d = n === "position" ? ` + var d; + const v = n === "position" ? "positionTarget" : "uvTarget", s = n === "position" ? "#usf " : "#usf ", u = n === "position" ? "#usf " : "#usf ", c = n === "position" ? "positionsList" : "uvsList", f = n === "position" ? ` float scaledProgress = uMorphProgress * ${e.length - 1}.; int baseIndex = int(floor(scaledProgress)); baseIndex = clamp(baseIndex, 0, ${e.length - 1}); @@ -3317,11 +3317,11 @@ const Pe = (e, t, n, r, i) => { ), r = r.replace( `${u}`, `vec${i} ${c}[${e.length}] = vec${i}[](${x}); - ${d} + ${f} ` ); } else - r = r.replace(`${s}`, ""), r = r.replace(`${u}`, ""), (f = t == null ? void 0 : t.attributes[n]) != null && f.array || Ie && console.error( + r = r.replace(`${s}`, ""), r = r.replace(`${u}`, ""), (d = t == null ? void 0 : t.attributes[n]) != null && d.array || Ie && console.error( `use-shader-fx:geometry.attributes.${n}.array is not found` ); return r; @@ -3336,13 +3336,13 @@ const Pe = (e, t, n, r, i) => { const s = Math.max(...i.map((u) => u.length)); i.forEach((u, c) => { if (u.length < s) { - const d = (s - u.length) / r, f = [], y = Array.from(u); - for (let x = 0; x < d; x++) { + const f = (s - u.length) / r, d = [], y = Array.from(u); + for (let x = 0; x < f; x++) { const o = Math.floor(u.length / r * Math.random()) * r; for (let g = 0; g < r; g++) - f.push(y[o + g]); + d.push(y[o + g]); } - i[c] = new Float32Array([...y, ...f]); + i[c] = new Float32Array([...y, ...d]); } }); } @@ -3352,8 +3352,8 @@ const Pe = (e, t, n, r, i) => { const r = {}; let i = "mapArrayColor = "; return e && e.length > 0 ? (e.forEach((s, u) => { - const c = `vMapArrayIndex < ${u}.1`, d = `texture2D(uMapArray${u}, uv)`; - i += `( ${c} ) ? ${d} : `, n += ` + const c = `vMapArrayIndex < ${u}.1`, f = `texture2D(uMapArray${u}, uv)`; + i += `( ${c} ) ? ${f} : `, n += ` uniform sampler2D uMapArray${u}; `, r[`uMapArray${u}`] = { value: s }; }), i += "vec4(1.);", n += "bool isMapArray = true;", r.uMapArrayLength = { value: e.length }) : (i += "vec4(1.0);", n += "bool isMapArray = false;", r.uMapArrayLength = { value: 0 }), { rewritedFragmentShader: t.replace("#usf ", i).replace("#usf ", n), mapArrayUniforms: r }; @@ -3370,13 +3370,13 @@ const Pe = (e, t, n, r, i) => { const c = b( () => Re(r, n, "position", 3), [r, n] - ), d = b( + ), f = b( () => Re(i, n, "uv", 2), [i, n] - ), f = b(() => { - c.length !== d.length && Ie && console.log("use-shader-fx:positions and uvs are not matched"); + ), d = b(() => { + c.length !== f.length && Ie && console.log("use-shader-fx:positions and uvs are not matched"); const x = Pe( - d, + f, n, "uv", Pe( @@ -3454,12 +3454,12 @@ const Pe = (e, t, n, r, i) => { }, [ n, c, - d, + f, v, u, s ]), y = Y(e, t); - return A(f)("uResolution", y.clone()), { material: f, modifiedPositions: c, modifiedUvs: d }; + return A(d)("uResolution", y.clone()), { material: d, modifiedPositions: c, modifiedUvs: f }; }, Pn = ({ size: e, dpr: t, @@ -3471,13 +3471,13 @@ const Pe = (e, t, n, r, i) => { uniforms: u, onBeforeCompile: c }) => { - const d = U(t), f = b(() => { + const f = U(t), d = b(() => { const M = r || new a.SphereGeometry(1, 32, 32); return M.setIndex(null), M.deleteAttribute("normal"), M; }, [r]), { material: y, modifiedPositions: x, modifiedUvs: o } = Dn({ size: e, - dpr: d.shader, - geometry: f, + dpr: f.shader, + geometry: d, positions: i, uvs: v, mapArray: s, @@ -3485,7 +3485,7 @@ const Pe = (e, t, n, r, i) => { onBeforeCompile: c }), { points: g, interactiveMesh: l } = _n({ scene: n, - geometry: f, + geometry: d, material: y }), p = A(y), m = z(y); return [ @@ -3554,9 +3554,9 @@ const Pe = (e, t, n, r, i) => { positions: s, uvs: u, uniforms: c, - onBeforeCompile: d + onBeforeCompile: f }) => { - const f = U(t), y = b(() => new a.Scene(), []), [ + const d = U(t), y = b(() => new a.Scene(), []), [ x, { points: o, @@ -3572,12 +3572,12 @@ const Pe = (e, t, n, r, i) => { positions: s, uvs: u, uniforms: c, - onBeforeCompile: d + onBeforeCompile: f }), [m, C] = W({ scene: y, camera: i, size: e, - dpr: f.fbo, + dpr: d.fbo, samples: n, isSizeUpdate: r, depthBuffer: !0 @@ -3608,12 +3608,12 @@ function Rn(e, t = 1e-4) { t = Math.max(t, Number.EPSILON); const n = {}, r = e.getIndex(), i = e.getAttribute("position"), v = r ? r.count : i.count; let s = 0; - const u = Object.keys(e.attributes), c = {}, d = {}, f = [], y = ["getX", "getY", "getZ", "getW"]; + const u = Object.keys(e.attributes), c = {}, f = {}, d = [], y = ["getX", "getY", "getZ", "getW"]; for (let l = 0, p = u.length; l < p; l++) { const m = u[l]; c[m] = []; const C = e.morphAttributes[m]; - C && (d[m] = new Array(C.length).fill(0).map(() => [])); + C && (f[m] = new Array(C.length).fill(0).map(() => [])); } const x = Math.log10(1 / t), o = Math.pow(10, x); for (let l = 0; l < v; l++) { @@ -3625,10 +3625,10 @@ function Rn(e, t = 1e-4) { m += `${~~(S[y[w]](p) * o)},`; } if (m in n) - f.push(n[m]); + d.push(n[m]); else { for (let C = 0, M = u.length; C < M; C++) { - const h = u[C], S = e.getAttribute(h), _ = e.morphAttributes[h], w = S.itemSize, I = c[h], R = d[h]; + const h = u[C], S = e.getAttribute(h), _ = e.morphAttributes[h], w = S.itemSize, I = c[h], R = f[h]; for (let F = 0; F < w; F++) { const P = y[F]; if (I.push(S[P](p)), _) @@ -3636,19 +3636,19 @@ function Rn(e, t = 1e-4) { R[O].push(_[O][P](p)); } } - n[m] = s, f.push(s), s++; + n[m] = s, d.push(s), s++; } } const g = e.clone(); for (let l = 0, p = u.length; l < p; l++) { const m = u[l], C = e.getAttribute(m), M = new C.array.constructor(c[m]), h = new De(M, C.itemSize, C.normalized); - if (g.setAttribute(m, h), m in d) - for (let S = 0; S < d[m].length; S++) { - const _ = e.morphAttributes[m][S], w = new _.array.constructor(d[m][S]), I = new De(w, _.itemSize, _.normalized); + if (g.setAttribute(m, h), m in f) + for (let S = 0; S < f[m].length; S++) { + const _ = e.morphAttributes[m][S], w = new _.array.constructor(f[m][S]), I = new De(w, _.itemSize, _.normalized); g.morphAttributes[m][S] = I; } } - return g.setIndex(f), g; + return g.setIndex(d), g; } var An = `#ifdef USE_TRANSMISSION @@ -4035,8 +4035,8 @@ const Ae = (e) => { transmissionMap: { value: null }, ...v } - }), c.onBeforeCompile = (f, y) => { - Object.assign(f.uniforms, c.userData.uniforms), f.vertexShader = Ae(f.vertexShader), f.fragmentShader = f.fragmentShader.replace( + }), c.onBeforeCompile = (d, y) => { + Object.assign(d.uniforms, c.userData.uniforms), d.vertexShader = Ae(d.vertexShader), d.fragmentShader = d.fragmentShader.replace( "#include ", ` #include @@ -4048,7 +4048,7 @@ const Ae = (e) => { diffuseColor = mix(diffuseColor, usf_DiffuseColor, uColorMix); } ` - ), f.fragmentShader = f.fragmentShader.replace( + ), d.fragmentShader = d.fragmentShader.replace( "void main() {", ` uniform vec3 uColor0; @@ -4083,20 +4083,20 @@ const Ae = (e) => { usf_DiffuseColor.rgb = mix(mix(uColor0, uColor1, colorPosMix.x), mix(uColor2, uColor3, colorPosMix.y), colorWobbleMix); ` - ), c.type === "MeshPhysicalMaterial" && i && (f.fragmentShader = f.fragmentShader.replace( + ), c.type === "MeshPhysicalMaterial" && i && (d.fragmentShader = d.fragmentShader.replace( "#include ", `${An}` - ), f.fragmentShader = f.fragmentShader.replace( + ), d.fragmentShader = d.fragmentShader.replace( "#include ", `${In}` - )), V(n)(f, y); + )), V(n)(d, y); }, c.needsUpdate = !0; - const d = new a.MeshDepthMaterial({ + const f = new a.MeshDepthMaterial({ depthPacking: a.RGBADepthPacking }); - return d.onBeforeCompile = (f, y) => { - Object.assign(f.uniforms, c.userData.uniforms), f.vertexShader = Ae(f.vertexShader), V(r)(f, y); - }, d.needsUpdate = !0, { material: c, depthMaterial: d }; + return f.onBeforeCompile = (d, y) => { + Object.assign(d.uniforms, c.userData.uniforms), d.vertexShader = Ae(d.vertexShader), V(r)(d, y); + }, f.needsUpdate = !0, { material: c, depthMaterial: f }; }, [ t, e, @@ -4122,14 +4122,14 @@ const Ae = (e) => { const c = b(() => { let p = t || new a.IcosahedronGeometry(2, 20); return p = Rn(p), p.computeTangents(), p; - }, [t]), { material: d, depthMaterial: f } = Fn({ + }, [t]), { material: f, depthMaterial: d } = Fn({ baseMaterial: r, materialParameters: i, onBeforeCompile: v, depthOnBeforeCompile: s, uniforms: u, isCustomTransmission: n - }), y = $(e, c, d, a.Mesh), x = d.userData, o = A(x), g = z(x); + }), y = $(e, c, f, a.Mesh), x = f.userData, o = A(x), g = z(x); return [ D( (p, m, C) => { @@ -4145,7 +4145,7 @@ const Ae = (e) => { ), { mesh: y, - depthMaterial: f + depthMaterial: d } ]; }, N = Object.freeze({ @@ -4179,8 +4179,8 @@ const Ae = (e) => { baseMaterial: s, materialParameters: u, uniforms: c, - onBeforeCompile: d, - depthOnBeforeCompile: f, + onBeforeCompile: f, + depthOnBeforeCompile: d, isCustomTransmission: y }) => { const x = U(t), o = b(() => new a.Scene(), []), [g, { mesh: l, depthMaterial: p }] = Vn({ @@ -4189,8 +4189,8 @@ const Ae = (e) => { scene: o, geometry: v, uniforms: c, - onBeforeCompile: d, - depthOnBeforeCompile: f, + onBeforeCompile: f, + depthOnBeforeCompile: d, isCustomTransmission: y }), [m, C] = W({ scene: o, @@ -4220,7 +4220,7 @@ const Ae = (e) => { output: m.texture } ]; -}, fr = (e, t, n) => { +}, dr = (e, t, n) => { const r = b(() => { const i = new a.Mesh(t, n); return e.add(i), i; @@ -4328,19 +4328,19 @@ function zn(e) { let t = Math.sin(e * 12.9898) * 43758.5453; return t - Math.floor(t); } -const dr = (e, t = "easeOutQuart") => { +const fr = (e, t = "easeOutQuart") => { const n = e / 60, r = ge[t]; return D( (v) => { let s = v.getElapsedTime() * n; const u = Math.floor(s), c = r(s - u); s = c + u; - const d = zn(u); + const f = zn(u); return { beat: s, floor: u, fract: c, - hash: d + hash: f }; }, [n, r] @@ -4452,15 +4452,15 @@ const En = ({ }), t.current = [], e.current = []; const s = new Array(v.dom.length).fill(!1); r.current = [...s], i.current = [...s], v.dom.forEach((u, c) => { - const d = (y) => { + const f = (y) => { y.forEach((x) => { v.onIntersect[c] && v.onIntersect[c](x), r.current[c] = x.isIntersecting; }); - }, f = new IntersectionObserver(d, { + }, d = new IntersectionObserver(f, { rootMargin: "0px", threshold: 0 }); - f.observe(u), e.current.push(f), t.current.push(u); + d.observe(u), e.current.push(d), t.current.push(u); }); }, [] @@ -4475,27 +4475,27 @@ const En = ({ scene: s, isIntersectingRef: u }) => { - s.children.length !== e.current.length && (e.current = new Array(s.children.length)), s.children.forEach((c, d) => { + s.children.length !== e.current.length && (e.current = new Array(s.children.length)), s.children.forEach((c, f) => { var x, o, g, l, p, m; - const f = n.dom[d]; - if (!f) + const d = n.dom[f]; + if (!d) return; - const y = f.getBoundingClientRect(); - if (e.current[d] = y, c.scale.set(y.width, y.height, 1), c.position.set( + const y = d.getBoundingClientRect(); + if (e.current[f] = y, c.scale.set(y.width, y.height, 1), c.position.set( y.left + y.width * 0.5 - i.width * 0.5, -y.top - y.height * 0.5 + i.height * 0.5, 0 - ), u.current[d] && (n.rotation[d] && c.rotation.copy(n.rotation[d]), c instanceof a.Mesh)) { + ), u.current[f] && (n.rotation[f] && c.rotation.copy(n.rotation[f]), c instanceof a.Mesh)) { const C = c.material, M = A(C), h = z(C); - M("u_texture", n.texture[d]), M("u_textureResolution", [ - ((g = (o = (x = n.texture[d]) == null ? void 0 : x.source) == null ? void 0 : o.data) == null ? void 0 : g.width) || 0, - ((m = (p = (l = n.texture[d]) == null ? void 0 : l.source) == null ? void 0 : p.data) == null ? void 0 : m.height) || 0 + M("u_texture", n.texture[f]), M("u_textureResolution", [ + ((g = (o = (x = n.texture[f]) == null ? void 0 : x.source) == null ? void 0 : o.data) == null ? void 0 : g.width) || 0, + ((m = (p = (l = n.texture[f]) == null ? void 0 : l.source) == null ? void 0 : p.data) == null ? void 0 : m.height) || 0 ]), M( "u_resolution", v.current.set(y.width, y.height) ), M( "u_borderRadius", - n.boderRadius[d] ? n.boderRadius[d] : 0 + n.boderRadius[f] ? n.boderRadius[f] : 0 ), h(r); } }); @@ -4534,9 +4534,9 @@ const En = ({ rotation: [], onIntersect: [] }, hr = ({ size: e, dpr: t, samples: n, isSizeUpdate: r, uniforms: i, onBeforeCompile: v }, s = []) => { - const u = U(t), c = b(() => new a.Scene(), []), d = j(e), [f, y] = W({ + const u = U(t), c = b(() => new a.Scene(), []), f = j(e), [d, y] = W({ scene: c, - camera: d, + camera: f, size: e, dpr: u.fbo, samples: n, @@ -4600,9 +4600,9 @@ const En = ({ F, { scene: c, - camera: d, - renderTarget: f, - output: f.texture, + camera: f, + renderTarget: d, + output: d.texture, isIntersecting: I, DOMRects: g, intersections: w.current, @@ -4619,11 +4619,11 @@ const En = ({ depthBuffer: s = !1, depthTexture: u = !1 }, c) => { - const d = L([]), f = Y(n, r); - d.current = b(() => Array.from({ length: c }, () => { + const f = L([]), d = Y(n, r); + f.current = b(() => Array.from({ length: c }, () => { const x = new a.WebGLRenderTarget( - f.x, - f.y, + d.x, + d.y, { ...he, samples: v, @@ -4631,21 +4631,21 @@ const En = ({ } ); return u && (x.depthTexture = new a.DepthTexture( - f.x, - f.y, + d.x, + d.y, a.FloatType )), x; - }), [c]), i && d.current.forEach( - (x) => x.setSize(f.x, f.y) + }), [c]), i && f.current.forEach( + (x) => x.setSize(d.x, d.y) ), ae(() => { - const x = d.current; + const x = f.current; return () => { x.forEach((o) => o.dispose()); }; }, [c]); const y = D( (x, o, g) => { - const l = d.current[o]; + const l = f.current[o]; return Ce({ gl: x, scene: e, @@ -4656,13 +4656,13 @@ const En = ({ }, [e, t] ); - return [d.current, y]; + return [f.current, y]; }; export { Zt as ALPHABLENDING_PARAMS, Sn as BLANK_PARAMS, ve as BLENDING_PARAMS, - fe as BRIGHTNESSPICKER_PARAMS, + de as BRIGHTNESSPICKER_PARAMS, ne as BRUSH_PARAMS, J as CHROMAKEY_PARAMS, Z as COLORSTRATA_PARAMS, @@ -4679,7 +4679,7 @@ export { Se as HSV_PARAMS, ue as MARBLE_PARAMS, E as MORPHPARTICLES_PARAMS, - de as MOTIONBLUR_PARAMS, + fe as MOTIONBLUR_PARAMS, re as NOISE_PARAMS, Mt as RIPPLE_PARAMS, ze as SIMPLEBLUR_PARAMS, @@ -4688,9 +4688,9 @@ export { Ce as renderFBO, z as setCustomUniform, A as setUniform, - fr as useAddMesh, + dr as useAddMesh, or as useAlphaBlending, - dr as useBeat, + fr as useBeat, vr as useBlank, er as useBlending, nr as useBrightnessPicker, 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 45ceab68..a011b0ae 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/planeVert.glsl","../src/libs/shaders/resolveShaders.ts","../src/utils/setOnBeforeCompile.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","../node_modules/three-stdlib/utils/BufferGeometryUtils.js","../src/fxs/3D/useWobble3D/shaders/transmission_pars_fragment.glsl","../src/fxs/3D/useWobble3D/shaders/transmission_fragment.glsl","../src/fxs/3D/useWobble3D/useMaterial.ts","../src/fxs/3D/useWobble3D/useCreateWobble3D.ts","../src/fxs/3D/useWobble3D/index.ts","../src/utils/useAddMesh.ts","../src/libs/easing.ts","../src/misc/useBeat.ts","../src/misc/useFPSLimiter.ts","../src/misc/useDomSyncer/utils/errorHandler.ts","../src/misc/useDomSyncer/shader/main.vert","../src/misc/useDomSyncer/shader/main.frag","../src/misc/useDomSyncer/utils/createMesh.ts","../src/misc/useDomSyncer/utils/useIntersectionHandler.ts","../src/misc/useDomSyncer/utils/useUpdateDomRect.ts","../src/misc/useDomSyncer/utils/useIsIntersecting.ts","../src/misc/useDomSyncer/utils/createUseDomView.ts","../src/misc/useDomSyncer/index.ts","../src/misc/useCopyTexture.ts"],"sourcesContent":["#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 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}","import * as THREE from \"three\";\n\nimport wobble3D from \"./shaderChunk/wobble3D.glsl\";\nimport snoise from \"./shaderChunk/snoise.glsl\";\nimport coverTexture from \"./shaderChunk/coverTexture.glsl\";\nimport fxBlending from \"./shaderChunk/fxBlending.glsl\";\nimport planeVert from \"./shaderChunk/planeVert.glsl\";\n\nconst SHADER_CHUNK: { [key: string]: string } = {\n wobble3D,\n snoise,\n coverTexture,\n fxBlending,\n planeVert,\n};\n\nconst includePattern = /^[ \\t]*#usf +<([\\w\\d./]+)>/gm;\n\nfunction includeReplacer(match: string, include: string) {\n let string = SHADER_CHUNK[include] || \"\";\n return resolveIncludes(string);\n}\n\nfunction resolveIncludes(string: string) {\n return string.replace(includePattern, includeReplacer);\n}\n\nexport const resolveShaders = (\n parameters: THREE.WebGLProgramParametersWithUniforms\n) => {\n parameters.vertexShader = resolveIncludes(parameters.vertexShader);\n parameters.fragmentShader = resolveIncludes(parameters.fragmentShader);\n};\n","import * as THREE from \"three\";\nimport { resolveShaders } from \"../libs/shaders/resolveShaders\";\n\ntype OnBeforeCompile = (\n parameters: THREE.WebGLProgramParametersWithUniforms,\n renderer: THREE.WebGLRenderer\n) => void;\n\nexport const setOnBeforeCompile = (\n onBeforeCompile?: OnBeforeCompile\n): OnBeforeCompile => {\n return (parameters, renderer) => {\n onBeforeCompile && onBeforeCompile(parameters, renderer);\n resolveShaders(parameters);\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 { 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uBuffer: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent\n transparent: true,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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_OPTION: THREE.RenderTargetOptions = {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n type: THREE.HalfFloatType,\n stencilBuffer: false,\n};\n\nexport type UseFboProps = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n size: Size;\n /** If dpr is set, dpr will be multiplied, default : `false` */\n dpr?: number | false;\n /** Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false` */\n isSizeUpdate?: boolean;\n /** Defines the count of MSAA samples. Can only be used with WebGL 2. default : `0.0` */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, default : `false` */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. default : `false` */\n depthTexture?: boolean;\n};\n\nexport const renderFBO = ({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender,\n onSwap,\n}: {\n gl: THREE.WebGLRenderer;\n fbo: THREE.WebGLRenderTarget;\n scene: THREE.Scene;\n camera: THREE.Camera;\n onBeforeRender: () => void;\n onSwap?: () => void;\n}) => {\n gl.setRenderTarget(fbo);\n onBeforeRender();\n gl.clear();\n gl.render(scene, camera);\n onSwap && onSwap();\n gl.setRenderTarget(null);\n gl.clear();\n};\n\ntype UpdateRenderTarget = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseSingleFBOReturn = [THREE.WebGLRenderTarget, UpdateRenderTarget];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [THREE.WebGLRenderTarget , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useSingleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseSingleFBOReturn => {\n const renderTarget = useRef();\n\n const resolution = useResolution(size, dpr);\n\n renderTarget.current = useMemo(\n () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { FBO_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget | null;\n write: THREE.WebGLRenderTarget | null;\n};\n\ninterface WebGLDoubleRenderTarget extends DoubleRenderTarget {\n swap: () => void;\n}\n\ntype FBOUpdateFunction = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({\n read,\n write,\n }: {\n read: THREE.Texture;\n write: THREE.Texture;\n }) => void\n) => THREE.Texture;\n\ntype UseDoubleFBOReturn = [\n { read: THREE.WebGLRenderTarget; write: THREE.WebGLRenderTarget },\n FBOUpdateFunction\n];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default : `false`\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false`\n * @returns [{read:THREE.WebGLRenderTarget,write:THREE.WebGLRenderTarget} , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useDoubleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseDoubleFBOReturn => {\n const renderTarget = useRef({\n read: null,\n write: null,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n });\n\n const resolution = useResolution(size, dpr);\n\n const initRenderTargets = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n\n if (depthTexture) {\n read.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n write.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n\n return { read, write };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n renderTarget.current.read = initRenderTargets.read;\n renderTarget.current.write = initRenderTargets.write;\n\n if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, []);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current;\n renderFBO({\n gl,\n scene,\n camera,\n fbo: fbo.write!,\n onBeforeRender: () =>\n onBeforeRender &&\n onBeforeRender({\n read: fbo.read!.texture,\n write: fbo.write!.texture,\n }),\n onSwap: () => fbo.swap(),\n });\n return fbo.read?.texture as THREE.Texture;\n },\n [scene, camera]\n );\n\n return [\n { read: renderTarget.current.read, write: renderTarget.current.write },\n updateRenderTarget,\n ];\n};\n","import { Dpr } from \"../fxs/types\";\n\nexport const getDpr = (\n dpr: Dpr\n): { shader: number | false; fbo: number | false } => {\n if (typeof dpr === \"number\") {\n return { shader: dpr, fbo: dpr };\n }\n return {\n shader: dpr.shader ?? false,\n fbo: dpr.fbo ?? false,\n };\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { PointerValues, usePointer } from \"../../../misc/usePointer\";\nimport {\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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const pressureEnd = useRef(null);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class AdvectionMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uSource: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n dt: { value: number };\n dissipation: { value: number };\n };\n}\n\nexport const useAdvectionMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class DivergenceMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useDivergenceMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const divergenceMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class PressureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uDivergence: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const usePressureMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const pressureMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: null },\n uDivergence: { value: null },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class CurlMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useCurlMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const curlMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class VorticityMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uCurl: { value: THREE.Texture };\n curl: { value: number };\n dt: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useVorticityMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const vorticityMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n uCurl: { value: null },\n curl: { value: 0 },\n dt: { value: DELTA_TIME },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class ClearMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n value: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useClearMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n value: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class GradientSubtractMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useGradientSubtractMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const gradientSubtractMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: DEFAULT_TEXTURE },\n uVelocity: { value: DEFAULT_TEXTURE },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\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 = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const splatMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 density_dissipation?: number;\n /** velocity dissipation , default : `0.99` */\n velocity_dissipation?: number;\n /** velocity acceleration , default : `10.0` */\n velocity_acceleration?: number;\n /** pressure dissipation , default : `0.9` */\n pressure_dissipation?: number;\n /** pressure iterations. affects performance , default : `20` */\n pressure_iterations?: number;\n /** curl_strength , default : `35` */\n curl_strength?: number;\n /** splat radius , default : `0.002` */\n splat_radius?: number;\n /** Fluid Color.THREE.Vector3 Alternatively, it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default : `THREE.Vector3(1.0, 1.0, 1.0)` */\n fluid_color?:\n | ((velocity: THREE.Vector2) => THREE.Vector3)\n | THREE.Vector3\n | THREE.Color;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type FluidObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n materials: FluidMaterials;\n camera: THREE.Camera;\n renderTarget: {\n velocity: DoubleRenderTarget;\n density: DoubleRenderTarget;\n curl: THREE.WebGLRenderTarget;\n divergence: THREE.WebGLRenderTarget;\n pressure: DoubleRenderTarget;\n };\n output: THREE.Texture;\n};\n\nexport const FLUID_PARAMS: FluidParams = Object.freeze({\n density_dissipation: 0.98,\n velocity_dissipation: 0.99,\n velocity_acceleration: 10.0,\n pressure_dissipation: 0.9,\n pressure_iterations: 20,\n curl_strength: 35,\n splat_radius: 0.002,\n fluid_color: new THREE.Vector3(1.0, 1.0, 1.0),\n pointerValues: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFluid = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n customFluidProps,\n}: {\n /** you can add `onBeforeComile` of the next material.`initial`,`curl`,`vorticity`,`advection`,`divergence`,`pressure`,`clear`,`gradientSubtract`,`splat` \n\t * ```ts\n\t * fluidOnBeforeCompile: {\n vorticity: {\n onBeforeCompile: (shader) => console.log(shader),\n\t\t\t\tuniforms:{\n\t\t\t\t\thoge: { value: 0.0 },\n\t\t\t\t}\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 }),\n [scene, camera, size, samples, _dpr.fbo, isSizeUpdate]\n );\n const [velocityFBO, updateVelocityFBO] = useDoubleFBO(fboProps);\n const [densityFBO, updateDensityFBO] = useDoubleFBO(fboProps);\n const [curlFBO, updateCurlFBO] = useSingleFBO(fboProps);\n const [divergenceFBO, updateDivergenceFBO] = useSingleFBO(fboProps);\n const [pressureFBO, updatePressureFBO] = useDoubleFBO(fboProps);\n\n const 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.velocity_dissipation!\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.density_dissipation!\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.velocity_acceleration!)\n );\n updateParamsList.splat(\n \"color\",\n spaltVec.current.set(scaledDiff.x, scaledDiff.y, 1.0)\n );\n updateParamsList.splat(\"radius\", params.splat_radius!);\n });\n updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n updateParamsList.splat(\"uTarget\", read);\n const color: THREE.Vector3 | THREE.Color =\n typeof params.fluid_color === \"function\"\n ? params.fluid_color(pointerValues.velocity)\n : params.fluid_color!;\n 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.curl_strength!);\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.pressure_dissipation!);\n });\n\n setMeshMaterial(materials.pressureMaterial);\n updateParamsList.pressure(\"uDivergence\", divergenceTex);\n let pressureTexTemp: THREE.Texture;\n for (let i = 0; i < params.pressure_iterations!; 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","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}","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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\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 uniforms: {\n uOpacity: { value: 0.0 },\n uMap: { value: texture || DEFAULT_TEXTURE },\n ...uniforms,\n },\n blending: THREE.AdditiveBlending,\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent.\n transparent: true,\n });\n return mat;\n }, [texture, uniforms]);\n\n const meshArr = useMemo(() => {\n const temp = [];\n for (let i = 0; i < max; i++) {\n const clonedMat = material.clone();\n\n clonedMat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\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 }, [onBeforeCompile, 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 fadeout_speed?: number;\n /** scale rate, default : `0.3` */\n scale?: number;\n /** alpha, default : `0.6` */\n alpha?: number;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type RippleObject = {\n scene: THREE.Scene;\n meshArr: THREE.Mesh[];\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const RIPPLE_PARAMS: RippleParams = Object.freeze({\n frequency: 0.01,\n rotation: 0.05,\n fadeout_speed: 0.9,\n scale: 0.3,\n alpha: 0.6,\n pointerValues: false,\n});\n\ninterface UseRippleProps extends HooksProps {\n /** texture applied to ripple */\n texture?: THREE.Texture;\n /** ripple size, default:64 */\n scale?: number;\n /** ripple max length, default:100 */\n max?: number;\n}\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useRipple = ({\n texture,\n scale = 64,\n max = 100,\n size,\n dpr,\n samples,\n isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: UseRippleProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const 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.fadeout_speed! * mesh.scale.x + params.scale!;\n mesh.scale.y = mesh.scale.x;\n const opacity = material.uniforms.uOpacity.value;\n setUniform(material)(\n \"uOpacity\",\n opacity * params.fadeout_speed!\n );\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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTime: { value: 0.0 },\n scale: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: 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: { value: COLORSTRATA_PARAMS.laminateInterval },\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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateValue = setUniform(material);\n 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 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(MARBLE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(COSPALETTE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uColor0: { value: DUOTONE_PARAMS.color0 },\n uColor1: { value: DUOTONE_PARAMS.color1 },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { FXTEXTURE_PARAMS } from \".\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture0: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_brightness: { value: BRIGHTNESSPICKER_PARAMS.brightness },\n u_min: { value: BRIGHTNESSPICKER_PARAMS.min },\n u_max: { value: BRIGHTNESSPICKER_PARAMS.max },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n uMapIntensity: { value: FXBLENDING_PARAMS.mapIntensity },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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 uniforms,\n onBeforeCompile,\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 });\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\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\nvoid main() {\n\tvec4 tex = texture2D(u_texture, vUv);\n\tvec3 hsv = rgb2hsv(tex.rgb);\n\thsv.y *= u_saturation;\n\thsv.z *= u_brightness;\n\tvec3 final = hsv2rgb(hsv);\n\tgl_FragColor = vec4(final, tex.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { HSV_PARAMS } from \".\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_brightness: { value: HSV_PARAMS.brightness },\n u_saturation: { value: HSV_PARAMS.saturation },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n uniforms,\n onBeforeCompile,\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 });\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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture: { value: DEFAULT_TEXTURE },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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 uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] =\n useParams(COVERTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uBlurSize: { value: SIMPLEBLUR_PARAMS.blurSize },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n const 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 const iterations = params.blurPower!;\n for (let i = 0; i < iterations; i++) {\n updateValue(\"uTexture\", _tempTexture);\n _tempTexture = updateTempTexture(gl);\n }\n\n return _tempTexture;\n },\n [updateTempTexture, updateValue, 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(MOTIONBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uEpicenter: { value: WAVE_PARAMS.epicenter },\n uProgress: { value: WAVE_PARAMS.progress },\n uStrength: { value: WAVE_PARAMS.strength },\n uWidth: { value: WAVE_PARAMS.width },\n uMode: { value: 0 },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(CHROMAKEY_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene; size: Size; dpr: number | false } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uBackbuffer: { value: DEFAULT_TEXTURE },\n uTime: { value: 0 },\n uPointer: { value: new THREE.Vector2() },\n uResolution: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) as BlankMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { BlankMaterial, 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(BLANK_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n size: Size;\n dpr: number | false;\n geometry: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\n mapArray?: THREE.Texture[];\n} & MaterialProps) => {\n const modifiedPositions = useMemo(\n () => modifyAttributes(positions, geometry, \"position\", 3),\n [positions, geometry]\n );\n\n const modifiedUvs = useMemo(\n () => modifyAttributes(uvs, geometry, \"uv\", 2),\n [uvs, geometry]\n );\n\n const material = useMemo(() => {\n if (modifiedPositions.length !== modifiedUvs.length) {\n ISDEV &&\n console.log(\"use-shader-fx:positions and uvs are not matched\");\n }\n\n // vertex\n const rewritedVertexShader = rewriteVertexShader(\n modifiedUvs,\n geometry,\n \"uv\",\n rewriteVertexShader(\n modifiedPositions,\n geometry,\n \"position\",\n vertexShader,\n 3\n ),\n 2\n );\n\n // fragment\n const { rewritedFragmentShader, mapArrayUniforms } =\n rewriteFragmentShader(mapArray, fragmentShader);\n\n const mat = new THREE.ShaderMaterial({\n vertexShader: rewritedVertexShader,\n fragmentShader: rewritedFragmentShader,\n blending: THREE.AdditiveBlending,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent\n transparent: true,\n uniforms: {\n uResolution: { value: new THREE.Vector2(0, 0) },\n uMorphProgress: { value: MORPHPARTICLES_PARAMS.morphProgress },\n uBlurAlpha: { value: MORPHPARTICLES_PARAMS.blurAlpha },\n uBlurRadius: { value: MORPHPARTICLES_PARAMS.blurRadius },\n uPointSize: { value: MORPHPARTICLES_PARAMS.pointSize },\n uPointAlpha: { value: MORPHPARTICLES_PARAMS.pointAlpha },\n uPicture: { value: 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: { value: MORPHPARTICLES_PARAMS.wobbleStrength },\n uWarpPositionFrequency: {\n value: MORPHPARTICLES_PARAMS.warpPositionFrequency,\n },\n uWarpTimeFrequency: {\n value: MORPHPARTICLES_PARAMS.warpTimeFrequency,\n },\n uWarpStrength: { value: MORPHPARTICLES_PARAMS.warpStrength },\n uDisplacement: { value: 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: { value: MORPHPARTICLES_PARAMS.sizeRandomMin },\n uSizeRandomMax: { value: MORPHPARTICLES_PARAMS.sizeRandomMax },\n uDivergence: { value: MORPHPARTICLES_PARAMS.divergence },\n uDivergencePoint: { value: MORPHPARTICLES_PARAMS.divergencePoint },\n ...mapArrayUniforms,\n ...uniforms,\n },\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [\n geometry,\n modifiedPositions,\n modifiedUvs,\n mapArray,\n onBeforeCompile,\n uniforms,\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 uniforms,\n onBeforeCompile,\n}: Create3DHooksProps &\n UseCreateMorphParticlesProps): UseCreateMorphParticlesReturn => {\n const _dpr = getDpr(dpr);\n\n const morphGeometry = useMemo(() => {\n const geo = geometry || new THREE.SphereGeometry(1, 32, 32);\n geo.setIndex(null);\n // Since it is a particle, normal is not necessary\n geo.deleteAttribute(\"normal\");\n return geo;\n }, [geometry]);\n\n const { material, modifiedPositions, modifiedUvs } = useMaterial({\n size,\n dpr: _dpr.shader,\n geometry: morphGeometry,\n positions,\n uvs,\n mapArray,\n uniforms,\n onBeforeCompile,\n });\n\n const { points, interactiveMesh } = useCreateObject({\n scene,\n geometry: morphGeometry,\n material,\n });\n\n const updateValue = setUniform(material);\n const 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 camera,\n geometry,\n positions,\n uvs,\n uniforms,\n onBeforeCompile,\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 uniforms,\n onBeforeCompile,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n });\n\n const updateFx = useCallback(\n (\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 { BufferGeometry, BufferAttribute, InterleavedBuffer, InterleavedBufferAttribute, TrianglesDrawMode, TriangleFanDrawMode, TriangleStripDrawMode, Vector3, Float32BufferAttribute } from \"three\";\nimport { getWithKey } from \"../types/helpers.js\";\nconst mergeBufferGeometries = (geometries, useGroups) => {\n const isIndexed = geometries[0].index !== null;\n const attributesUsed = new Set(Object.keys(geometries[0].attributes));\n const morphAttributesUsed = new Set(Object.keys(geometries[0].morphAttributes));\n const attributes = {};\n const morphAttributes = {};\n const morphTargetsRelative = geometries[0].morphTargetsRelative;\n const mergedGeometry = new BufferGeometry();\n let offset = 0;\n geometries.forEach((geom, i) => {\n let attributesCount = 0;\n if (isIndexed !== (geom.index !== null)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.\"\n );\n return null;\n }\n for (let name in geom.attributes) {\n if (!attributesUsed.has(name)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.'\n );\n return null;\n }\n if (attributes[name] === void 0) {\n attributes[name] = [];\n }\n attributes[name].push(geom.attributes[name]);\n attributesCount++;\n }\n if (attributesCount !== attributesUsed.size) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". Make sure all geometries have the same number of attributes.\"\n );\n return null;\n }\n if (morphTargetsRelative !== geom.morphTargetsRelative) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". .morphTargetsRelative must be consistent throughout all geometries.\"\n );\n return null;\n }\n for (let name in geom.morphAttributes) {\n if (!morphAttributesUsed.has(name)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". .morphAttributes must be consistent throughout all geometries.\"\n );\n return null;\n }\n if (morphAttributes[name] === void 0)\n morphAttributes[name] = [];\n morphAttributes[name].push(geom.morphAttributes[name]);\n }\n mergedGeometry.userData.mergedUserData = mergedGeometry.userData.mergedUserData || [];\n mergedGeometry.userData.mergedUserData.push(geom.userData);\n if (useGroups) {\n let count;\n if (geom.index) {\n count = geom.index.count;\n } else if (geom.attributes.position !== void 0) {\n count = geom.attributes.position.count;\n } else {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". The geometry must have either an index or a position attribute\"\n );\n return null;\n }\n mergedGeometry.addGroup(offset, count, i);\n offset += count;\n }\n });\n if (isIndexed) {\n let indexOffset = 0;\n const mergedIndex = [];\n geometries.forEach((geom) => {\n const index = geom.index;\n for (let j = 0; j < index.count; ++j) {\n mergedIndex.push(index.getX(j) + indexOffset);\n }\n indexOffset += geom.attributes.position.count;\n });\n mergedGeometry.setIndex(mergedIndex);\n }\n for (let name in attributes) {\n const mergedAttribute = mergeBufferAttributes(attributes[name]);\n if (!mergedAttribute) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the \" + name + \" attribute.\"\n );\n return null;\n }\n mergedGeometry.setAttribute(name, mergedAttribute);\n }\n for (let name in morphAttributes) {\n const numMorphTargets = morphAttributes[name][0].length;\n if (numMorphTargets === 0)\n break;\n mergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n mergedGeometry.morphAttributes[name] = [];\n for (let i = 0; i < numMorphTargets; ++i) {\n const morphAttributesToMerge = [];\n for (let j = 0; j < morphAttributes[name].length; ++j) {\n morphAttributesToMerge.push(morphAttributes[name][j][i]);\n }\n const mergedMorphAttribute = mergeBufferAttributes(morphAttributesToMerge);\n if (!mergedMorphAttribute) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the \" + name + \" morphAttribute.\"\n );\n return null;\n }\n mergedGeometry.morphAttributes[name].push(mergedMorphAttribute);\n }\n }\n return mergedGeometry;\n};\nconst mergeBufferAttributes = (attributes) => {\n let TypedArray = void 0;\n let itemSize = void 0;\n let normalized = void 0;\n let arrayLength = 0;\n attributes.forEach((attr) => {\n if (TypedArray === void 0) {\n TypedArray = attr.array.constructor;\n }\n if (TypedArray !== attr.array.constructor) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.\"\n );\n return null;\n }\n if (itemSize === void 0)\n itemSize = attr.itemSize;\n if (itemSize !== attr.itemSize) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.\"\n );\n return null;\n }\n if (normalized === void 0)\n normalized = attr.normalized;\n if (normalized !== attr.normalized) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.\"\n );\n return null;\n }\n arrayLength += attr.array.length;\n });\n if (TypedArray && itemSize) {\n const array = new TypedArray(arrayLength);\n let offset = 0;\n attributes.forEach((attr) => {\n array.set(attr.array, offset);\n offset += attr.array.length;\n });\n return new BufferAttribute(array, itemSize, normalized);\n }\n};\nconst interleaveAttributes = (attributes) => {\n let TypedArray = void 0;\n let arrayLength = 0;\n let stride = 0;\n for (let i = 0, l = attributes.length; i < l; ++i) {\n const attribute = attributes[i];\n if (TypedArray === void 0)\n TypedArray = attribute.array.constructor;\n if (TypedArray !== attribute.array.constructor) {\n console.error(\"AttributeBuffers of different types cannot be interleaved\");\n return null;\n }\n arrayLength += attribute.array.length;\n stride += attribute.itemSize;\n }\n const interleavedBuffer = new InterleavedBuffer(new TypedArray(arrayLength), stride);\n let offset = 0;\n const res = [];\n const getters = [\"getX\", \"getY\", \"getZ\", \"getW\"];\n const setters = [\"setX\", \"setY\", \"setZ\", \"setW\"];\n for (let j = 0, l = attributes.length; j < l; j++) {\n const attribute = attributes[j];\n const itemSize = attribute.itemSize;\n const count = attribute.count;\n const iba = new InterleavedBufferAttribute(interleavedBuffer, itemSize, offset, attribute.normalized);\n res.push(iba);\n offset += itemSize;\n for (let c = 0; c < count; c++) {\n for (let k = 0; k < itemSize; k++) {\n const set = getWithKey(iba, setters[k]);\n const get = getWithKey(attribute, getters[k]);\n set(c, get(c));\n }\n }\n }\n return res;\n};\nfunction estimateBytesUsed(geometry) {\n let mem = 0;\n for (let name in geometry.attributes) {\n const attr = geometry.getAttribute(name);\n mem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n }\n const indices = geometry.getIndex();\n mem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n return mem;\n}\nfunction mergeVertices(geometry, tolerance = 1e-4) {\n tolerance = Math.max(tolerance, Number.EPSILON);\n const hashToIndex = {};\n const indices = geometry.getIndex();\n const positions = geometry.getAttribute(\"position\");\n const vertexCount = indices ? indices.count : positions.count;\n let nextIndex = 0;\n const attributeNames = Object.keys(geometry.attributes);\n const attrArrays = {};\n const morphAttrsArrays = {};\n const newIndices = [];\n const getters = [\"getX\", \"getY\", \"getZ\", \"getW\"];\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n const name = attributeNames[i];\n attrArrays[name] = [];\n const morphAttr = geometry.morphAttributes[name];\n if (morphAttr) {\n morphAttrsArrays[name] = new Array(morphAttr.length).fill(0).map(() => []);\n }\n }\n const decimalShift = Math.log10(1 / tolerance);\n const shiftMultiplier = Math.pow(10, decimalShift);\n for (let i = 0; i < vertexCount; i++) {\n const index = indices ? indices.getX(i) : i;\n let hash = \"\";\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const itemSize = attribute.itemSize;\n for (let k = 0; k < itemSize; k++) {\n hash += `${~~(attribute[getters[k]](index) * shiftMultiplier)},`;\n }\n }\n if (hash in hashToIndex) {\n newIndices.push(hashToIndex[hash]);\n } else {\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const morphAttr = geometry.morphAttributes[name];\n const itemSize = attribute.itemSize;\n const newarray = attrArrays[name];\n const newMorphArrays = morphAttrsArrays[name];\n for (let k = 0; k < itemSize; k++) {\n const getterFunc = getters[k];\n newarray.push(attribute[getterFunc](index));\n if (morphAttr) {\n for (let m = 0, ml = morphAttr.length; m < ml; m++) {\n newMorphArrays[m].push(morphAttr[m][getterFunc](index));\n }\n }\n }\n }\n hashToIndex[hash] = nextIndex;\n newIndices.push(nextIndex);\n nextIndex++;\n }\n }\n const result = geometry.clone();\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n const name = attributeNames[i];\n const oldAttribute = geometry.getAttribute(name);\n const buffer = new oldAttribute.array.constructor(attrArrays[name]);\n const attribute = new BufferAttribute(buffer, oldAttribute.itemSize, oldAttribute.normalized);\n result.setAttribute(name, attribute);\n if (name in morphAttrsArrays) {\n for (let j = 0; j < morphAttrsArrays[name].length; j++) {\n const oldMorphAttribute = geometry.morphAttributes[name][j];\n const buffer2 = new oldMorphAttribute.array.constructor(morphAttrsArrays[name][j]);\n const morphAttribute = new BufferAttribute(buffer2, oldMorphAttribute.itemSize, oldMorphAttribute.normalized);\n result.morphAttributes[name][j] = morphAttribute;\n }\n }\n }\n result.setIndex(newIndices);\n return result;\n}\nfunction toTrianglesDrawMode(geometry, drawMode) {\n if (drawMode === TrianglesDrawMode) {\n console.warn(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.\");\n return geometry;\n }\n if (drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode) {\n let index = geometry.getIndex();\n if (index === null) {\n const indices = [];\n const position = geometry.getAttribute(\"position\");\n if (position !== void 0) {\n for (let i = 0; i < position.count; i++) {\n indices.push(i);\n }\n geometry.setIndex(indices);\n index = geometry.getIndex();\n } else {\n console.error(\n \"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.\"\n );\n return geometry;\n }\n }\n const numberOfTriangles = index.count - 2;\n const newIndices = [];\n if (index) {\n if (drawMode === TriangleFanDrawMode) {\n for (let i = 1; i <= numberOfTriangles; i++) {\n newIndices.push(index.getX(0));\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n }\n } else {\n for (let i = 0; i < numberOfTriangles; i++) {\n if (i % 2 === 0) {\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i + 2));\n } else {\n newIndices.push(index.getX(i + 2));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i));\n }\n }\n }\n }\n if (newIndices.length / 3 !== numberOfTriangles) {\n console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.\");\n }\n const newGeometry = geometry.clone();\n newGeometry.setIndex(newIndices);\n newGeometry.clearGroups();\n return newGeometry;\n } else {\n console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:\", drawMode);\n return geometry;\n }\n}\nfunction computeMorphedAttributes(object) {\n if (object.geometry.isBufferGeometry !== true) {\n console.error(\"THREE.BufferGeometryUtils: Geometry is not of type BufferGeometry.\");\n return null;\n }\n const _vA = new Vector3();\n const _vB = new Vector3();\n const _vC = new Vector3();\n const _tempA = new Vector3();\n const _tempB = new Vector3();\n const _tempC = new Vector3();\n const _morphA = new Vector3();\n const _morphB = new Vector3();\n const _morphC = new Vector3();\n function _calculateMorphedAttributeData(object2, material2, attribute, morphAttribute, morphTargetsRelative2, a2, b2, c2, modifiedAttributeArray) {\n _vA.fromBufferAttribute(attribute, a2);\n _vB.fromBufferAttribute(attribute, b2);\n _vC.fromBufferAttribute(attribute, c2);\n const morphInfluences = object2.morphTargetInfluences;\n if (\n // @ts-ignore\n material2.morphTargets && morphAttribute && morphInfluences\n ) {\n _morphA.set(0, 0, 0);\n _morphB.set(0, 0, 0);\n _morphC.set(0, 0, 0);\n for (let i2 = 0, il2 = morphAttribute.length; i2 < il2; i2++) {\n const influence = morphInfluences[i2];\n const morph = morphAttribute[i2];\n if (influence === 0)\n continue;\n _tempA.fromBufferAttribute(morph, a2);\n _tempB.fromBufferAttribute(morph, b2);\n _tempC.fromBufferAttribute(morph, c2);\n if (morphTargetsRelative2) {\n _morphA.addScaledVector(_tempA, influence);\n _morphB.addScaledVector(_tempB, influence);\n _morphC.addScaledVector(_tempC, influence);\n } else {\n _morphA.addScaledVector(_tempA.sub(_vA), influence);\n _morphB.addScaledVector(_tempB.sub(_vB), influence);\n _morphC.addScaledVector(_tempC.sub(_vC), influence);\n }\n }\n _vA.add(_morphA);\n _vB.add(_morphB);\n _vC.add(_morphC);\n }\n if (object2.isSkinnedMesh) {\n object2.boneTransform(a2, _vA);\n object2.boneTransform(b2, _vB);\n object2.boneTransform(c2, _vC);\n }\n modifiedAttributeArray[a2 * 3 + 0] = _vA.x;\n modifiedAttributeArray[a2 * 3 + 1] = _vA.y;\n modifiedAttributeArray[a2 * 3 + 2] = _vA.z;\n modifiedAttributeArray[b2 * 3 + 0] = _vB.x;\n modifiedAttributeArray[b2 * 3 + 1] = _vB.y;\n modifiedAttributeArray[b2 * 3 + 2] = _vB.z;\n modifiedAttributeArray[c2 * 3 + 0] = _vC.x;\n modifiedAttributeArray[c2 * 3 + 1] = _vC.y;\n modifiedAttributeArray[c2 * 3 + 2] = _vC.z;\n }\n const geometry = object.geometry;\n const material = object.material;\n let a, b, c;\n const index = geometry.index;\n const positionAttribute = geometry.attributes.position;\n const morphPosition = geometry.morphAttributes.position;\n const morphTargetsRelative = geometry.morphTargetsRelative;\n const normalAttribute = geometry.attributes.normal;\n const morphNormal = geometry.morphAttributes.position;\n const groups = geometry.groups;\n const drawRange = geometry.drawRange;\n let i, j, il, jl;\n let group, groupMaterial;\n let start, end;\n const modifiedPosition = new Float32Array(positionAttribute.count * positionAttribute.itemSize);\n const modifiedNormal = new Float32Array(normalAttribute.count * normalAttribute.itemSize);\n if (index !== null) {\n if (Array.isArray(material)) {\n for (i = 0, il = groups.length; i < il; i++) {\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n start = Math.max(group.start, drawRange.start);\n end = Math.min(group.start + group.count, drawRange.start + drawRange.count);\n for (j = start, jl = end; j < jl; j += 3) {\n a = index.getX(j);\n b = index.getX(j + 1);\n c = index.getX(j + 2);\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else {\n start = Math.max(0, drawRange.start);\n end = Math.min(index.count, drawRange.start + drawRange.count);\n for (i = start, il = end; i < il; i += 3) {\n a = index.getX(i);\n b = index.getX(i + 1);\n c = index.getX(i + 2);\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else if (positionAttribute !== void 0) {\n if (Array.isArray(material)) {\n for (i = 0, il = groups.length; i < il; i++) {\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n start = Math.max(group.start, drawRange.start);\n end = Math.min(group.start + group.count, drawRange.start + drawRange.count);\n for (j = start, jl = end; j < jl; j += 3) {\n a = j;\n b = j + 1;\n c = j + 2;\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else {\n start = Math.max(0, drawRange.start);\n end = Math.min(positionAttribute.count, drawRange.start + drawRange.count);\n for (i = start, il = end; i < il; i += 3) {\n a = i;\n b = i + 1;\n c = i + 2;\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n }\n const morphedPositionAttribute = new Float32BufferAttribute(modifiedPosition, 3);\n const morphedNormalAttribute = new Float32BufferAttribute(modifiedNormal, 3);\n return {\n positionAttribute,\n normalAttribute,\n morphedPositionAttribute,\n morphedNormalAttribute\n };\n}\nfunction toCreasedNormals(geometry, creaseAngle = Math.PI / 3) {\n const creaseDot = Math.cos(creaseAngle);\n const hashMultiplier = (1 + 1e-10) * 100;\n const verts = [new Vector3(), new Vector3(), new Vector3()];\n const tempVec1 = new Vector3();\n const tempVec2 = new Vector3();\n const tempNorm = new Vector3();\n const tempNorm2 = new Vector3();\n function hashVertex(v) {\n const x = ~~(v.x * hashMultiplier);\n const y = ~~(v.y * hashMultiplier);\n const z = ~~(v.z * hashMultiplier);\n return `${x},${y},${z}`;\n }\n const resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;\n const posAttr = resultGeometry.attributes.position;\n const vertexMap = {};\n for (let i = 0, l = posAttr.count / 3; i < l; i++) {\n const i3 = 3 * i;\n const a = verts[0].fromBufferAttribute(posAttr, i3 + 0);\n const b = verts[1].fromBufferAttribute(posAttr, i3 + 1);\n const c = verts[2].fromBufferAttribute(posAttr, i3 + 2);\n tempVec1.subVectors(c, b);\n tempVec2.subVectors(a, b);\n const normal = new Vector3().crossVectors(tempVec1, tempVec2).normalize();\n for (let n = 0; n < 3; n++) {\n const vert = verts[n];\n const hash = hashVertex(vert);\n if (!(hash in vertexMap)) {\n vertexMap[hash] = [];\n }\n vertexMap[hash].push(normal);\n }\n }\n const normalArray = new Float32Array(posAttr.count * 3);\n const normAttr = new BufferAttribute(normalArray, 3, false);\n for (let i = 0, l = posAttr.count / 3; i < l; i++) {\n const i3 = 3 * i;\n const a = verts[0].fromBufferAttribute(posAttr, i3 + 0);\n const b = verts[1].fromBufferAttribute(posAttr, i3 + 1);\n const c = verts[2].fromBufferAttribute(posAttr, i3 + 2);\n tempVec1.subVectors(c, b);\n tempVec2.subVectors(a, b);\n tempNorm.crossVectors(tempVec1, tempVec2).normalize();\n for (let n = 0; n < 3; n++) {\n const vert = verts[n];\n const hash = hashVertex(vert);\n const otherNormals = vertexMap[hash];\n tempNorm2.set(0, 0, 0);\n for (let k = 0, lk = otherNormals.length; k < lk; k++) {\n const otherNorm = otherNormals[k];\n if (tempNorm.dot(otherNorm) > creaseDot) {\n tempNorm2.add(otherNorm);\n }\n }\n tempNorm2.normalize();\n normAttr.setXYZ(i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z);\n }\n }\n resultGeometry.setAttribute(\"normal\", normAttr);\n return resultGeometry;\n}\nexport {\n computeMorphedAttributes,\n estimateBytesUsed,\n interleaveAttributes,\n mergeBufferAttributes,\n mergeBufferGeometries,\n mergeVertices,\n toCreasedNormals,\n toTrianglesDrawMode\n};\n//# sourceMappingURL=BufferGeometryUtils.js.map\n","#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 { useMemo } from \"react\";\nimport transmission_pars_fragment from \"./shaders/transmission_pars_fragment.glsl\";\nimport transmission_fragment from \"./shaders/transmission_fragment.glsl\";\nimport { WOBBLE3D_PARAMS } from \".\";\nimport { MaterialProps } from \"../../types\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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\n/** You also need to rewrite the vertext shader of depthMaterial */\nconst rewriteVertex = (vertex: string) => {\n let shader = vertex;\n shader = shader.replace(\n \"#include \",\n `\n\t\tvec3 objectNormal = usf_Normal;\n\t\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t\t#endif`\n );\n // position\n shader = shader.replace(\n \"#include \",\n `\n\t\tvec3 transformed = usf_Position;`\n );\n\n // uniforms\n shader = shader.replace(\n \"void main() {\",\n `\n\t\tuniform float uTime;\n\t\tuniform float uWobblePositionFrequency;\n\t\tuniform float uWobbleTimeFrequency;\n\t\tuniform float uWobbleStrength;\n\t\tuniform float uWarpPositionFrequency;\n\t\tuniform float uWarpTimeFrequency;\n\t\tuniform float uWarpStrength;\n\t\tattribute vec4 tangent;\n\t\tvarying float vWobble;\n\t\tvarying vec2 vPosition;\n\t\t// edge\n\t\tvarying vec3 vEdgeNormal;\n\t\tvarying vec3 vEdgeViewPosition;\n\t\t#usf \n\t\tvoid main() {\n\t\t`\n );\n\n // vert\n shader = shader.replace(\n \"void main() {\",\n `\n\t\tvoid main() {\n\t\tvec3 usf_Position = position;\n\t\tvec3 usf_Normal = normal;\n\t\tvec3 biTangent = cross(normal, tangent.xyz);\n\t\t\n\t\t// Neighbours positions\n\t\tfloat shift = 0.01;\n\t\tvec3 positionA = usf_Position + tangent.xyz * shift;\n\t\tvec3 positionB = usf_Position + biTangent * shift;\n\t\t\n\t\t// wobble\n\t\tfloat wobble = (uWobbleStrength > 0.) ? getWobble(usf_Position) : 0.0;\n\t\tfloat wobblePositionA = (uWobbleStrength > 0.) ? getWobble(positionA) : 0.0;\n\t\tfloat wobblePositionB = (uWobbleStrength > 0.) ? getWobble(positionB) : 0.0;\n\t\t\n\t\tusf_Position += wobble * normal;\n\t\tpositionA += wobblePositionA * normal;\n\t\tpositionB += wobblePositionB * normal;\n\n\t\t// Compute normal\n\t\tvec3 toA = normalize(positionA - usf_Position);\n\t\tvec3 toB = normalize(positionB - usf_Position);\n\t\tusf_Normal = cross(toA, toB);\n\t\t\n\t\t// Varying\n\t\tvPosition = usf_Position.xy;\n\t\tvWobble = wobble/uWobbleStrength;\n\t\t\n\t\tvEdgeNormal = normalize(normalMatrix * usf_Normal);\n\t\tvec4 viewPosition = viewMatrix * modelMatrix * vec4(usf_Position, 1.0);\n\t\tvEdgeViewPosition = normalize(viewPosition.xyz);\n\t\t`\n );\n return shader;\n};\n\nexport type WobbleMaterialConstructor = new (opts: {\n [key: string]: any;\n}) => THREE.Material;\ntype WobbleMaterialParams =\n ConstructorParameters[0];\nexport interface WobbleMaterialProps\n extends MaterialProps {\n /** default:THREE.MeshPhysicalMaterial */\n baseMaterial?: T;\n materialParameters?: WobbleMaterialParams;\n /**\n * An optional callback that is executed immediately before the depth shader program is compiled.\n * @param shader — Source code of the shader\n * @param renderer — WebGLRenderer Context that is initializing the material\n */\n depthOnBeforeCompile?: (\n shader: THREE.WebGLProgramParametersWithUniforms,\n renderer: THREE.WebGLRenderer\n ) => 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 onBeforeCompile,\n depthOnBeforeCompile,\n isCustomTransmission = false,\n uniforms,\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 ...uniforms,\n },\n });\n\n mat.onBeforeCompile = (shader, renderer) => {\n Object.assign(shader.uniforms, mat.userData.uniforms);\n\n /********************\n\t\t\tvert\n\t\t\t********************/\n shader.vertexShader = rewriteVertex(shader.vertexShader);\n\n /********************\n\t\t\tfrag\n\t\t\t********************/\n // diffuse color , Manipulate color mixing ratio with `uColorMix`\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `\n\t\t\t\t\t#include \n\n\t\t\t\t\tif (uEdgeThreshold > 0.0) {\n\t\t\t\t\t\tfloat edgeThreshold = dot(vEdgeNormal, -vEdgeViewPosition);\n\t\t\t\t\t\tdiffuseColor = edgeThreshold < uEdgeThreshold ? vec4(uEdgeColor, 1.0) : mix(diffuseColor, usf_DiffuseColor, uColorMix);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdiffuseColor = mix(diffuseColor, usf_DiffuseColor, uColorMix);\n\t\t\t\t\t}\n\t\t\t\t`\n );\n\n // frag\n shader.fragmentShader = shader.fragmentShader.replace(\n \"void main() {\",\n `\n\t\t\t\tuniform vec3 uColor0;\n\t\t\t\tuniform vec3 uColor1;\n\t\t\t\tuniform vec3 uColor2;\n\t\t\t\tuniform vec3 uColor3;\n\t\t\t\tuniform float uColorMix;\n\t\t\t\tuniform float uEdgeThreshold;\n\t\t\t\tuniform vec3 uEdgeColor;\n\t\t\t\t\n\t\t\t\t// transmission\n\t\t\t\tuniform float uChromaticAberration; \n\t\t\t\tuniform float uAnisotropicBlur; \n\t\t\t\tuniform float uTime;\n\t\t\t\tuniform float uDistortion;\n\t\t\t\tuniform float uDistortionScale;\n\t\t\t\tuniform float uTemporalDistortion;\n\t\t\t\tuniform float uRefractionSamples;\n\t\t\t\t\n\t\t\t\tfloat rand(float n){return fract(sin(n) * 43758.5453123);}\n\t\t\t\t#usf \n\n\t\t\t\tvarying float vWobble;\n\t\t\t\tvarying vec2 vPosition;\n\t\t\t\tvarying vec3 vEdgeNormal;\n\t\t\t\tvarying vec3 vEdgeViewPosition;\n\t\t\t\t\n\t\t\t\tvoid main(){\n\t\t\t\t\tvec4 usf_DiffuseColor = vec4(1.0);\n\t\t\t\t\tfloat colorWobbleMix = smoothstep(-1.,1.,vWobble);\n\t\t\t\t\tvec2 colorPosMix = vec2(smoothstep(-1.,1.,vPosition.x),smoothstep(-1.,1.,vPosition.y));\n\t\t\t\t\n\t\t\t\t\tusf_DiffuseColor.rgb = mix(mix(uColor0, uColor1, colorPosMix.x), mix(uColor2, uColor3, colorPosMix.y), colorWobbleMix);\n\t\t\t\t`\n );\n\n // custom transmission\n if (mat.type === \"MeshPhysicalMaterial\" && isCustomTransmission) {\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `${transmission_pars_fragment}`\n );\n\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `${transmission_fragment}`\n );\n }\n\n setOnBeforeCompile(onBeforeCompile)(shader, renderer);\n };\n mat.needsUpdate = true;\n\n /*===============================================\n\t\tdepthMaterial\n\t\t===============================================*/\n const depthMat = new THREE.MeshDepthMaterial({\n depthPacking: THREE.RGBADepthPacking,\n });\n depthMat.onBeforeCompile = (shader, renderer) => {\n Object.assign(shader.uniforms, mat.userData.uniforms);\n shader.vertexShader = rewriteVertex(shader.vertexShader);\n setOnBeforeCompile(depthOnBeforeCompile)(shader, renderer);\n };\n depthMat.needsUpdate = true;\n\n return { material: mat, depthMaterial: depthMat };\n }, [\n materialParameters,\n baseMaterial,\n onBeforeCompile,\n depthOnBeforeCompile,\n uniforms,\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 onBeforeCompile,\n depthOnBeforeCompile,\n uniforms,\n}: UseCreateWobble3DProps &\n Create3DHooksProps &\n WobbleMaterialProps): UseCreateWobble3DReturn => {\n const wobbleGeometry = useMemo(() => {\n let geo = geometry || new THREE.IcosahedronGeometry(2, 20);\n geo = mergeVertices(geo);\n geo.computeTangents();\n return geo;\n }, [geometry]);\n const { material, depthMaterial } = useMaterial({\n baseMaterial,\n materialParameters,\n onBeforeCompile,\n depthOnBeforeCompile,\n uniforms,\n isCustomTransmission,\n });\n\n const mesh = useAddObject(scene, wobbleGeometry, material, THREE.Mesh);\n\n const userData = material.userData as Wobble3DMaterial;\n const updateValue = setUniform(userData);\n const 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 isSizeUpdate,\n camera,\n geometry,\n baseMaterial,\n materialParameters,\n uniforms,\n onBeforeCompile,\n depthOnBeforeCompile,\n isCustomTransmission,\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 uniforms,\n onBeforeCompile,\n depthOnBeforeCompile,\n isCustomTransmission,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n });\n\n const updateFx = useCallback(\n (\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","export type EasingTypes =\n | \"easeInSine\"\n | \"easeOutSine\"\n | \"easeInOutSine\"\n | \"easeInQuad\"\n | \"easeOutQuad\"\n | \"easeInOutQuad\"\n | \"easeInCubic\"\n | \"easeOutCubic\"\n | \"easeInOutCubic\"\n | \"easeInQuart\"\n | \"easeOutQuart\"\n | \"easeInOutQuart\"\n | \"easeInQuint\"\n | \"easeOutQuint\"\n | \"easeInOutQuint\"\n | \"easeInExpo\"\n | \"easeOutExpo\"\n | \"easeInOutExpo\"\n | \"easeInCirc\"\n | \"easeOutCirc\"\n | \"easeInOutCirc\"\n | \"easeInBack\"\n | \"easeOutBack\"\n | \"easeInOutBack\"\n | \"easeInElastic\"\n | \"easeOutElastic\"\n | \"easeInOutElastic\"\n | \"easeInBounce\"\n | \"easeOutBounce\"\n | \"easeInOutBounce\";\n\ntype EasingFunctions = {\n [K in EasingTypes]: (x: number) => number;\n};\n\n/**\n * from https://github.com/ai/easings.net\n */\nexport const Easing: EasingFunctions = Object.freeze({\n easeInSine(x: number): number {\n return 1 - Math.cos((x * Math.PI) / 2);\n },\n easeOutSine(x: number): number {\n return Math.sin((x * Math.PI) / 2);\n },\n easeInOutSine(x: number): number {\n return -(Math.cos(Math.PI * x) - 1) / 2;\n },\n easeInQuad(x: number): number {\n return x * x;\n },\n easeOutQuad(x: number): number {\n return 1 - (1 - x) * (1 - x);\n },\n easeInOutQuad(x: number): number {\n return x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2;\n },\n easeInCubic(x: number): number {\n return x * x * x;\n },\n easeOutCubic(x: number): number {\n return 1 - Math.pow(1 - x, 3);\n },\n easeInOutCubic(x: number): number {\n return x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2;\n },\n easeInQuart(x: number): number {\n return x * x * x * x;\n },\n easeOutQuart(x: number): number {\n return 1 - Math.pow(1 - x, 4);\n },\n easeInOutQuart(x: number): number {\n return x < 0.5 ? 8 * x * x * x * x : 1 - Math.pow(-2 * x + 2, 4) / 2;\n },\n easeInQuint(x: number): number {\n return x * x * x * x * x;\n },\n easeOutQuint(x: number): number {\n return 1 - Math.pow(1 - x, 5);\n },\n easeInOutQuint(x: number): number {\n return x < 0.5 ? 16 * x * x * x * x * x : 1 - Math.pow(-2 * x + 2, 5) / 2;\n },\n easeInExpo(x: number): number {\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\n },\n easeOutExpo(x: number): number {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n },\n easeInOutExpo(x: number): number {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? Math.pow(2, 20 * x - 10) / 2\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\n },\n easeInCirc(x: number): number {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n },\n easeOutCirc(x: number): number {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n },\n easeInOutCirc(x: number): number {\n return x < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\n },\n easeInBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return c3 * x * x * x - c1 * x * x;\n },\n easeOutBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return 1 + c3 * Math.pow(x - 1, 3) + c1 * Math.pow(x - 1, 2);\n },\n easeInOutBack(x: number): number {\n const c1 = 1.70158;\n const c2 = c1 * 1.525;\n\n return x < 0.5\n ? (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2\n : (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2;\n },\n easeInElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\n },\n easeOutElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1;\n },\n easeInOutElastic(x: number): number {\n const c5 = (2 * Math.PI) / 4.5;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * c5)) / 2\n : (Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * c5)) / 2 +\n 1;\n },\n easeInBounce(x: number): number {\n return 1 - Easing.easeOutBounce(1 - x);\n },\n easeOutBounce(x: number): number {\n const n1 = 7.5625;\n const d1 = 2.75;\n\n if (x < 1 / d1) {\n return n1 * x * x;\n } else if (x < 2 / d1) {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n } else if (x < 2.5 / d1) {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n } else {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n },\n easeInOutBounce(x: number): number {\n return x < 0.5\n ? (1 - Easing.easeOutBounce(1 - 2 * x)) / 2\n : (1 + Easing.easeOutBounce(2 * x - 1)) / 2;\n },\n});\n","import * as THREE from \"three\";\nimport { Easing, EasingTypes } from \"../libs/easing\";\nimport { useCallback } from \"react\";\n\n/** Returns a unique hash specific to the beat */\nfunction getHash(input: number) {\n let n = Math.sin(input * 12.9898) * 43758.5453;\n return n - Math.floor(n);\n}\n\ntype BeatValues = {\n beat: number;\n floor: number;\n fract: number;\n /** unique hash specific to the beat */\n hash: number;\n};\n\n/**\n * @param ease easing functions are referenced from https://github.com/ai/easings.net , default : \"easeOutQuart\"\n */\nexport const useBeat = (bpm: number, ease: EasingTypes = \"easeOutQuart\") => {\n const rhythm = bpm / 60;\n const easing = Easing[ease];\n const updateBeat = useCallback(\n (clock: THREE.Clock) => {\n let beat = clock.getElapsedTime() * rhythm;\n const floor = Math.floor(beat);\n const fract = easing(beat - floor);\n beat = fract + floor;\n const hash = getHash(floor);\n return {\n beat,\n floor,\n fract,\n hash,\n } as BeatValues;\n },\n [rhythm, easing]\n );\n return updateBeat;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo, useRef } from \"react\";\n\n/**\n * @param fps FPS you want to limit , default : `60`\n *\n * ```tsx\n * const limiter = useFPSLimiter(fps);\n * useFrame((props) => {\n * if (limiter(props.clock)) {\n *\t\t //some code\n * }\n * });\n * ```\n */\nexport const useFPSLimiter = (fps: number = 60) => {\n const interval = useMemo(() => 1 / Math.max(Math.min(fps, 60), 1), [fps]);\n const prevTime = useRef(null);\n\n const limiter = useCallback(\n (clock: THREE.Clock) => {\n const tick = clock.getElapsedTime();\n if (prevTime.current === null) {\n prevTime.current = tick;\n return true;\n }\n const deltaTime = tick - prevTime.current;\n if (deltaTime >= interval) {\n prevTime.current = tick;\n return true;\n }\n return false;\n },\n [interval]\n );\n\n return limiter;\n};\n","import { DomSyncerParams } from \"..\";\n\nexport const errorHandler = (params: DomSyncerParams) => {\n const domLength = params.dom?.length;\n const textureLength = params.texture?.length;\n\n if (!domLength || !textureLength) {\n return true;\n }\n\n if (domLength !== textureLength) {\n return true;\n }\n\n return false;\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec2 u_textureResolution;\nuniform vec2 u_resolution;\nuniform float u_borderRadius;\n\nvoid main() {\n\t// texuture color\n\tfloat screenAspect = u_resolution.x / u_resolution.y;\n\tfloat textureAspect = u_textureResolution.x / u_textureResolution.y;\n\tvec2 ratio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\n\tvec2 adjustedUv = vUv * ratio + (1.0 - ratio) * 0.5;\n\tvec3 textureColor = texture2D(u_texture, adjustedUv).rgb;\n\tfloat textureAlpha = texture2D(u_texture, adjustedUv).a;\n\n\t// Based on https://mofu-dev.com/en/blog/three-dom-alignment/\n\tfloat maxSide = max(u_resolution.x, u_resolution.y);\n\tfloat minSide = min(u_resolution.x, u_resolution.y);\n\tvec2 aspect = u_resolution / maxSide;\n\tvec2 alphaUv = vUv - 0.5;\n\n\tfloat borderRadius = min(u_borderRadius, minSide * 0.5);\n\tvec2 offset = vec2(borderRadius) / u_resolution;\n\tvec2 alphaXY = smoothstep(vec2(0.5 - offset), vec2(0.5 - offset - 0.001), abs(alphaUv));\n\tfloat alpha = min(1.0, alphaXY.x + alphaXY.y);\n\n\tvec2 alphaUv2 = abs(vUv - 0.5);\n\tfloat radius = borderRadius / maxSide;\n\talphaUv2 = (alphaUv2 - 0.5) * aspect + radius;\n\tfloat roundAlpha = smoothstep(radius + 0.001, radius, length(alphaUv2));\n\n\talpha = min(1.0, alpha + roundAlpha);\n\n\t// multiply texture alpha\n\talpha *= textureAlpha;\n\n\tgl_FragColor = vec4(textureColor, alpha);\n}\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"../\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"../shader/main.vert\";\nimport fragmentShader from \"../shader/main.frag\";\nimport { MaterialProps } from \"../../../fxs/types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../libs/constants\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n params: DomSyncerParams;\n size: Size;\n scene: THREE.Scene;\n} & MaterialProps) => {\n if (scene.children.length > 0) {\n scene.children.forEach((child) => {\n if (child instanceof THREE.Mesh) {\n child.geometry.dispose();\n child.material.dispose();\n }\n });\n scene.remove(...scene.children);\n }\n\n params.texture!.forEach((texture, i) => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: texture },\n u_textureResolution: {\n value: new THREE.Vector2(0, 0),\n },\n u_resolution: { value: new THREE.Vector2(0, 0) },\n u_borderRadius: {\n value: params.boderRadius![i] ? params.boderRadius![i] : 0.0,\n },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent.\n transparent: true,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n const mesh = new THREE.Mesh(new THREE.PlaneGeometry(1, 1), mat);\n scene.add(mesh);\n });\n};\n","import { useCallback, useRef } from \"react\";\nimport { DomSyncerParams } from \"..\";\n\nexport const useIntersectionHandler = () => {\n const intersectionObserverRef = useRef([]);\n const intersectionDomRef = useRef<(HTMLElement | Element | null)[]>([]);\n\n const intersectionHandler = useCallback(\n ({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n }: {\n isIntersectingRef: React.MutableRefObject;\n isIntersectingOnceRef: React.MutableRefObject;\n params: DomSyncerParams;\n }) => {\n if (intersectionObserverRef.current.length > 0) {\n intersectionObserverRef.current.forEach((observer, i) => {\n observer.unobserve(intersectionDomRef.current[i]!);\n });\n }\n\n intersectionDomRef.current = [];\n intersectionObserverRef.current = [];\n\n const newArr = new Array(params.dom!.length).fill(false);\n isIntersectingRef.current = [...newArr];\n isIntersectingOnceRef.current = [...newArr];\n\n params.dom!.forEach((dom, i) => {\n const callback = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n params.onIntersect![i] && params.onIntersect![i](entry);\n // Update the judgment after execution so that the judgment of isIntersectin can be used when executing onIntersect\n isIntersectingRef.current[i] = entry.isIntersecting;\n });\n };\n const observer = new IntersectionObserver(callback, {\n rootMargin: \"0px\",\n threshold: 0,\n });\n observer.observe(dom!);\n intersectionObserverRef.current.push(observer);\n intersectionDomRef.current.push(dom!);\n });\n },\n []\n );\n\n return intersectionHandler;\n};\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"..\";\nimport { Size } from \"@react-three/fiber\";\nimport {\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, samples, isSizeUpdate, uniforms, onBeforeCompile }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n const [params, setParams] = useParams({\n ...DOMSYNCER_PARAMS,\n updateKey: performance.now(),\n });\n\n const [DOMRects, updateDomRects] = useUpdateDomRect();\n\n // Avoid instancing vec2 every frame\n const resolutionRef = useRef(new THREE.Vector2(0, 0));\n\n // Update monitored doms according to the dependency array\n const [refreshTrigger, setRefreshTrigger] = useState(true);\n useMemo(\n () => setRefreshTrigger(true),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n dependencies\n );\n\n // If the dependencies have been updated but the key has not been updated, skip processing and return an empty texture\n const updateKey = useRef(null);\n const emptyTexture = useMemo(() => 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 uniforms,\n onBeforeCompile,\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 uniforms,\n intersectionHandler,\n onBeforeCompile,\n refreshTrigger,\n scene,\n params,\n isIntersectingOnceRef,\n isIntersectingRef,\n emptyTexture,\n updateParams,\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 { UseFboProps, renderFBO, FBO_OPTION } from \"../utils/useSingleFBO\";\n\ntype UpdateCopyFunction = (\n gl: THREE.WebGLRenderer,\n index: number,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseCopyTextureReturn = [THREE.WebGLRenderTarget[], UpdateCopyFunction];\n\n/**\n * Generate an FBO array to copy the texture.\n * @param dpr If dpr is set, dpr will be multiplied, default : `false`\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false`\n * @param length The number of FBOs to create\n * @returns [THREE.WebGLRenderTarget[] , updateCopyTexture] - Receives the RenderTarget array as the first argument and the update function as the second argument. `updateCopyTexture()` receives gl as the first argument and the index of the texture you want to copy as the second argument.\n */\nexport const useCopyTexture = (\n {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n }: UseFboProps,\n length: number\n): UseCopyTextureReturn => {\n const renderTargetArr = useRef([]);\n const resolution = useResolution(size, dpr);\n\n renderTargetArr.current = useMemo(() => {\n return Array.from({ length }, () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [length]);\n\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","setUniform","material","key","value","uniforms","setCustomUniform","customParams","useAddObject","scene","geometry","Proto","object3D","obj","useEffect","ISDEV","MATERIAL_BASIC_PARAMS","DEFAULT_TEXTURE","wobble3D_default","snoise_default","coverTexture_default","fxBlending_default","planeVert_default","SHADER_CHUNK","wobble3D","snoise","coverTexture","fxBlending","planeVert","includePattern","includeReplacer","match","include","string","resolveIncludes","resolveShaders","parameters","setOnBeforeCompile","onBeforeCompile","renderer","useMesh","mat","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_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","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","iterations","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","mergeVertices","tolerance","hashToIndex","indices","vertexCount","nextIndex","attributeNames","attrArrays","morphAttrsArrays","newIndices","getters","l","name","morphAttr","decimalShift","shiftMultiplier","hash","k","newarray","newMorphArrays","getterFunc","m","ml","result","oldAttribute","buffer","BufferAttribute","oldMorphAttribute","buffer2","morphAttribute","transmission_pars_fragment_default","transmission_fragment_default","rewriteVertex","vertex","shader","baseMaterial","materialParameters","depthOnBeforeCompile","isCustomTransmission","depthMaterial","WOBBLE3D_PARAMS","transmission_pars_fragment","transmission_fragment","depthMat","useCreateWobble3D","wobbleGeometry","userData","useWobble3D","RootState","useAddMesh","Easing","x","c2","c4","c5","getHash","input","n","useBeat","bpm","ease","rhythm","easing","beat","floor","fract","useFPSLimiter","fps","interval","prevTime","tick","errorHandler","domLength","textureLength","createMesh","child","useIntersectionHandler","intersectionObserverRef","intersectionDomRef","isIntersectingRef","isIntersectingOnceRef","observer","newArr","dom","callback","entries","entry","useUpdateDomRect","domRects","updateDomRects","resolutionRef","domElement","rect","useIsIntersecting","isIntersecting","once","createUseDomView","onView","onHidden","isView","id","filterIntersection","item","DOMSYNCER_PARAMS","useDomSyncer","dependencies","DOMRects","refreshTrigger","setRefreshTrigger","useState","updateKey","emptyTexture","intersectionHandler","useDomView","useCopyTexture","length","renderTargetArr","updateCopyTexture"],"mappings":"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","x_google_ignoreList":[123]} \ 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/planeVert.glsl","../src/libs/shaders/resolveShaders.ts","../src/utils/setOnBeforeCompile.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","../node_modules/three-stdlib/utils/BufferGeometryUtils.js","../src/fxs/3D/useWobble3D/shaders/transmission_pars_fragment.glsl","../src/fxs/3D/useWobble3D/shaders/transmission_fragment.glsl","../src/fxs/3D/useWobble3D/useMaterial.ts","../src/fxs/3D/useWobble3D/useCreateWobble3D.ts","../src/fxs/3D/useWobble3D/index.ts","../src/utils/useAddMesh.ts","../src/libs/easing.ts","../src/misc/useBeat.ts","../src/misc/useFPSLimiter.ts","../src/misc/useDomSyncer/utils/errorHandler.ts","../src/misc/useDomSyncer/shader/main.vert","../src/misc/useDomSyncer/shader/main.frag","../src/misc/useDomSyncer/utils/createMesh.ts","../src/misc/useDomSyncer/utils/useIntersectionHandler.ts","../src/misc/useDomSyncer/utils/useUpdateDomRect.ts","../src/misc/useDomSyncer/utils/useIsIntersecting.ts","../src/misc/useDomSyncer/utils/createUseDomView.ts","../src/misc/useDomSyncer/index.ts","../src/misc/useCopyTexture.ts"],"sourcesContent":["#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 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}","import * as THREE from \"three\";\n\nimport wobble3D from \"./shaderChunk/wobble3D.glsl\";\nimport snoise from \"./shaderChunk/snoise.glsl\";\nimport coverTexture from \"./shaderChunk/coverTexture.glsl\";\nimport fxBlending from \"./shaderChunk/fxBlending.glsl\";\nimport planeVert from \"./shaderChunk/planeVert.glsl\";\n\nconst SHADER_CHUNK: { [key: string]: string } = {\n wobble3D,\n snoise,\n coverTexture,\n fxBlending,\n planeVert,\n};\n\nconst includePattern = /^[ \\t]*#usf +<([\\w\\d./]+)>/gm;\n\nfunction includeReplacer(match: string, include: string) {\n let string = SHADER_CHUNK[include] || \"\";\n return resolveIncludes(string);\n}\n\nfunction resolveIncludes(string: string) {\n return string.replace(includePattern, includeReplacer);\n}\n\nexport const resolveShaders = (\n parameters: THREE.WebGLProgramParametersWithUniforms\n) => {\n parameters.vertexShader = resolveIncludes(parameters.vertexShader);\n parameters.fragmentShader = resolveIncludes(parameters.fragmentShader);\n};\n","import * as THREE from \"three\";\nimport { resolveShaders } from \"../libs/shaders/resolveShaders\";\n\ntype OnBeforeCompile = (\n parameters: THREE.WebGLProgramParametersWithUniforms,\n renderer: THREE.WebGLRenderer\n) => void;\n\nexport const setOnBeforeCompile = (\n onBeforeCompile?: OnBeforeCompile\n): OnBeforeCompile => {\n return (parameters, renderer) => {\n onBeforeCompile && onBeforeCompile(parameters, renderer);\n resolveShaders(parameters);\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 { 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uBuffer: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent\n transparent: true,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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_OPTION: THREE.RenderTargetOptions = {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n type: THREE.HalfFloatType,\n stencilBuffer: false,\n};\n\nexport type UseFboProps = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n size: Size;\n /** If dpr is set, dpr will be multiplied, default : `false` */\n dpr?: number | false;\n /** Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false` */\n isSizeUpdate?: boolean;\n /** Defines the count of MSAA samples. Can only be used with WebGL 2. default : `0.0` */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, default : `false` */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. default : `false` */\n depthTexture?: boolean;\n};\n\nexport const renderFBO = ({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender,\n onSwap,\n}: {\n gl: THREE.WebGLRenderer;\n fbo: THREE.WebGLRenderTarget;\n scene: THREE.Scene;\n camera: THREE.Camera;\n onBeforeRender: () => void;\n onSwap?: () => void;\n}) => {\n gl.setRenderTarget(fbo);\n onBeforeRender();\n gl.clear();\n gl.render(scene, camera);\n onSwap && onSwap();\n gl.setRenderTarget(null);\n gl.clear();\n};\n\ntype UpdateRenderTarget = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseSingleFBOReturn = [THREE.WebGLRenderTarget, UpdateRenderTarget];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [THREE.WebGLRenderTarget , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useSingleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseSingleFBOReturn => {\n const renderTarget = useRef();\n\n const resolution = useResolution(size, dpr);\n\n renderTarget.current = useMemo(\n () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { FBO_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget | null;\n write: THREE.WebGLRenderTarget | null;\n};\n\ninterface WebGLDoubleRenderTarget extends DoubleRenderTarget {\n swap: () => void;\n}\n\ntype FBOUpdateFunction = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({\n read,\n write,\n }: {\n read: THREE.Texture;\n write: THREE.Texture;\n }) => void\n) => THREE.Texture;\n\ntype UseDoubleFBOReturn = [\n { read: THREE.WebGLRenderTarget; write: THREE.WebGLRenderTarget },\n FBOUpdateFunction\n];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default : `false`\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false`\n * @returns [{read:THREE.WebGLRenderTarget,write:THREE.WebGLRenderTarget} , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useDoubleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseDoubleFBOReturn => {\n const renderTarget = useRef({\n read: null,\n write: null,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n });\n\n const resolution = useResolution(size, dpr);\n\n const initRenderTargets = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n\n if (depthTexture) {\n read.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n write.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n\n return { read, write };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n renderTarget.current.read = initRenderTargets.read;\n renderTarget.current.write = initRenderTargets.write;\n\n if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, []);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current;\n renderFBO({\n gl,\n scene,\n camera,\n fbo: fbo.write!,\n onBeforeRender: () =>\n onBeforeRender &&\n onBeforeRender({\n read: fbo.read!.texture,\n write: fbo.write!.texture,\n }),\n onSwap: () => fbo.swap(),\n });\n return fbo.read?.texture as THREE.Texture;\n },\n [scene, camera]\n );\n\n return [\n { read: renderTarget.current.read, write: renderTarget.current.write },\n updateRenderTarget,\n ];\n};\n","import { Dpr } from \"../fxs/types\";\n\nexport const getDpr = (\n dpr: Dpr\n): { shader: number | false; fbo: number | false } => {\n if (typeof dpr === \"number\") {\n return { shader: dpr, fbo: dpr };\n }\n return {\n shader: dpr.shader ?? false,\n fbo: dpr.fbo ?? false,\n };\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { PointerValues, usePointer } from \"../../../misc/usePointer\";\nimport {\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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const pressureEnd = useRef(null);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class AdvectionMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uSource: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n dt: { value: number };\n dissipation: { value: number };\n };\n}\n\nexport const useAdvectionMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class DivergenceMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useDivergenceMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const divergenceMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class PressureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uDivergence: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const usePressureMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const pressureMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: null },\n uDivergence: { value: null },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class CurlMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useCurlMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const curlMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class VorticityMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uCurl: { value: THREE.Texture };\n curl: { value: number };\n dt: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useVorticityMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const vorticityMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n uCurl: { value: null },\n curl: { value: 0 },\n dt: { value: DELTA_TIME },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class ClearMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n value: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useClearMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n value: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class GradientSubtractMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useGradientSubtractMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const gradientSubtractMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: DEFAULT_TEXTURE },\n uVelocity: { value: DEFAULT_TEXTURE },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\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 = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const splatMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 density_dissipation?: number;\n /** velocity dissipation , default : `0.99` */\n velocity_dissipation?: number;\n /** velocity acceleration , default : `10.0` */\n velocity_acceleration?: number;\n /** pressure dissipation , default : `0.9` */\n pressure_dissipation?: number;\n /** pressure iterations. affects performance , default : `20` */\n pressure_iterations?: number;\n /** curl_strength , default : `35` */\n curl_strength?: number;\n /** splat radius , default : `0.002` */\n splat_radius?: number;\n /** Fluid Color.THREE.Vector3 Alternatively, it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default : `THREE.Vector3(1.0, 1.0, 1.0)` */\n fluid_color?:\n | ((velocity: THREE.Vector2) => THREE.Vector3)\n | THREE.Vector3\n | THREE.Color;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type FluidObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n materials: FluidMaterials;\n camera: THREE.Camera;\n renderTarget: {\n velocity: DoubleRenderTarget;\n density: DoubleRenderTarget;\n curl: THREE.WebGLRenderTarget;\n divergence: THREE.WebGLRenderTarget;\n pressure: DoubleRenderTarget;\n };\n output: THREE.Texture;\n};\n\nexport const FLUID_PARAMS: FluidParams = Object.freeze({\n density_dissipation: 0.98,\n velocity_dissipation: 0.99,\n velocity_acceleration: 10.0,\n pressure_dissipation: 0.9,\n pressure_iterations: 20,\n curl_strength: 35,\n splat_radius: 0.002,\n fluid_color: new THREE.Vector3(1.0, 1.0, 1.0),\n pointerValues: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFluid = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n customFluidProps,\n}: {\n /** you can add `onBeforeComile` of the next material.`initial`,`curl`,`vorticity`,`advection`,`divergence`,`pressure`,`clear`,`gradientSubtract`,`splat` \n\t * ```ts\n\t * fluidOnBeforeCompile: {\n vorticity: {\n onBeforeCompile: (shader) => console.log(shader),\n\t\t\t\tuniforms:{\n\t\t\t\t\thoge: { value: 0.0 },\n\t\t\t\t}\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 }),\n [scene, camera, size, samples, _dpr.fbo, isSizeUpdate]\n );\n const [velocityFBO, updateVelocityFBO] = useDoubleFBO(fboProps);\n const [densityFBO, updateDensityFBO] = useDoubleFBO(fboProps);\n const [curlFBO, updateCurlFBO] = useSingleFBO(fboProps);\n const [divergenceFBO, updateDivergenceFBO] = useSingleFBO(fboProps);\n const [pressureFBO, updatePressureFBO] = useDoubleFBO(fboProps);\n\n const 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.velocity_dissipation!\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.density_dissipation!\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.velocity_acceleration!)\n );\n updateParamsList.splat(\n \"color\",\n spaltVec.current.set(scaledDiff.x, scaledDiff.y, 1.0)\n );\n updateParamsList.splat(\"radius\", params.splat_radius!);\n });\n updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n updateParamsList.splat(\"uTarget\", read);\n const color: THREE.Vector3 | THREE.Color =\n typeof params.fluid_color === \"function\"\n ? params.fluid_color(pointerValues.velocity)\n : params.fluid_color!;\n 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.curl_strength!);\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.pressure_dissipation!);\n });\n\n setMeshMaterial(materials.pressureMaterial);\n updateParamsList.pressure(\"uDivergence\", divergenceTex);\n let pressureTexTemp: THREE.Texture;\n for (let i = 0; i < params.pressure_iterations!; 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","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}","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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\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 uniforms: {\n uOpacity: { value: 0.0 },\n uMap: { value: texture || DEFAULT_TEXTURE },\n ...uniforms,\n },\n blending: THREE.AdditiveBlending,\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent.\n transparent: true,\n });\n return mat;\n }, [texture, uniforms]);\n\n const meshArr = useMemo(() => {\n const temp = [];\n for (let i = 0; i < max; i++) {\n const clonedMat = material.clone();\n\n clonedMat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\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 }, [onBeforeCompile, 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 fadeout_speed?: number;\n /** scale rate, default : `0.3` */\n scale?: number;\n /** alpha, default : `0.6` */\n alpha?: number;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type RippleObject = {\n scene: THREE.Scene;\n meshArr: THREE.Mesh[];\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const RIPPLE_PARAMS: RippleParams = Object.freeze({\n frequency: 0.01,\n rotation: 0.05,\n fadeout_speed: 0.9,\n scale: 0.3,\n alpha: 0.6,\n pointerValues: false,\n});\n\ninterface UseRippleProps extends HooksProps {\n /** texture applied to ripple */\n texture?: THREE.Texture;\n /** ripple size, default:64 */\n scale?: number;\n /** ripple max length, default:100 */\n max?: number;\n}\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useRipple = ({\n texture,\n scale = 64,\n max = 100,\n size,\n dpr,\n samples,\n isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: UseRippleProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const 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.fadeout_speed! * mesh.scale.x + params.scale!;\n mesh.scale.y = mesh.scale.x;\n const opacity = material.uniforms.uOpacity.value;\n setUniform(material)(\n \"uOpacity\",\n opacity * params.fadeout_speed!\n );\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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTime: { value: 0.0 },\n scale: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: 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: { value: COLORSTRATA_PARAMS.laminateInterval },\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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateValue = setUniform(material);\n 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 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(MARBLE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(COSPALETTE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uColor0: { value: DUOTONE_PARAMS.color0 },\n uColor1: { value: DUOTONE_PARAMS.color1 },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { FXTEXTURE_PARAMS } from \".\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture0: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_brightness: { value: BRIGHTNESSPICKER_PARAMS.brightness },\n u_min: { value: BRIGHTNESSPICKER_PARAMS.min },\n u_max: { value: BRIGHTNESSPICKER_PARAMS.max },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n uMapIntensity: { value: FXBLENDING_PARAMS.mapIntensity },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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 uniforms,\n onBeforeCompile,\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 });\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\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\nvoid main() {\n\tvec4 tex = texture2D(u_texture, vUv);\n\tvec3 hsv = rgb2hsv(tex.rgb);\n\thsv.y *= u_saturation;\n\thsv.z *= u_brightness;\n\tvec3 final = hsv2rgb(hsv);\n\tgl_FragColor = vec4(final, tex.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { HSV_PARAMS } from \".\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_brightness: { value: HSV_PARAMS.brightness },\n u_saturation: { value: HSV_PARAMS.saturation },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n uniforms,\n onBeforeCompile,\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 });\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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture: { value: DEFAULT_TEXTURE },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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 uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] =\n useParams(COVERTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uBlurSize: { value: SIMPLEBLUR_PARAMS.blurSize },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n const 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 const iterations = params.blurPower!;\n for (let i = 0; i < iterations; i++) {\n updateValue(\"uTexture\", _tempTexture);\n _tempTexture = updateTempTexture(gl);\n }\n\n return _tempTexture;\n },\n [updateTempTexture, updateValue, 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(MOTIONBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uEpicenter: { value: WAVE_PARAMS.epicenter },\n uProgress: { value: WAVE_PARAMS.progress },\n uStrength: { value: WAVE_PARAMS.strength },\n uWidth: { value: WAVE_PARAMS.width },\n uMode: { value: 0 },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(CHROMAKEY_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene; size: Size; dpr: number | false } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uBackbuffer: { value: DEFAULT_TEXTURE },\n uTime: { value: 0 },\n uPointer: { value: new THREE.Vector2() },\n uResolution: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) as BlankMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { BlankMaterial, 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(BLANK_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n size: Size;\n dpr: number | false;\n geometry: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\n mapArray?: THREE.Texture[];\n} & MaterialProps) => {\n const modifiedPositions = useMemo(\n () => modifyAttributes(positions, geometry, \"position\", 3),\n [positions, geometry]\n );\n\n const modifiedUvs = useMemo(\n () => modifyAttributes(uvs, geometry, \"uv\", 2),\n [uvs, geometry]\n );\n\n const material = useMemo(() => {\n if (modifiedPositions.length !== modifiedUvs.length) {\n ISDEV &&\n console.log(\"use-shader-fx:positions and uvs are not matched\");\n }\n\n // vertex\n const rewritedVertexShader = rewriteVertexShader(\n modifiedUvs,\n geometry,\n \"uv\",\n rewriteVertexShader(\n modifiedPositions,\n geometry,\n \"position\",\n vertexShader,\n 3\n ),\n 2\n );\n\n // fragment\n const { rewritedFragmentShader, mapArrayUniforms } =\n rewriteFragmentShader(mapArray, fragmentShader);\n\n const mat = new THREE.ShaderMaterial({\n vertexShader: rewritedVertexShader,\n fragmentShader: rewritedFragmentShader,\n blending: THREE.AdditiveBlending,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent\n transparent: true,\n uniforms: {\n uResolution: { value: new THREE.Vector2(0, 0) },\n uMorphProgress: { value: MORPHPARTICLES_PARAMS.morphProgress },\n uBlurAlpha: { value: MORPHPARTICLES_PARAMS.blurAlpha },\n uBlurRadius: { value: MORPHPARTICLES_PARAMS.blurRadius },\n uPointSize: { value: MORPHPARTICLES_PARAMS.pointSize },\n uPointAlpha: { value: MORPHPARTICLES_PARAMS.pointAlpha },\n uPicture: { value: 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: { value: MORPHPARTICLES_PARAMS.wobbleStrength },\n uWarpPositionFrequency: {\n value: MORPHPARTICLES_PARAMS.warpPositionFrequency,\n },\n uWarpTimeFrequency: {\n value: MORPHPARTICLES_PARAMS.warpTimeFrequency,\n },\n uWarpStrength: { value: MORPHPARTICLES_PARAMS.warpStrength },\n uDisplacement: { value: 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: { value: MORPHPARTICLES_PARAMS.sizeRandomMin },\n uSizeRandomMax: { value: MORPHPARTICLES_PARAMS.sizeRandomMax },\n uDivergence: { value: MORPHPARTICLES_PARAMS.divergence },\n uDivergencePoint: { value: MORPHPARTICLES_PARAMS.divergencePoint },\n ...mapArrayUniforms,\n ...uniforms,\n },\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [\n geometry,\n modifiedPositions,\n modifiedUvs,\n mapArray,\n onBeforeCompile,\n uniforms,\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 uniforms,\n onBeforeCompile,\n}: Create3DHooksProps &\n UseCreateMorphParticlesProps): UseCreateMorphParticlesReturn => {\n const _dpr = getDpr(dpr);\n\n const morphGeometry = useMemo(() => {\n const geo = geometry || new THREE.SphereGeometry(1, 32, 32);\n geo.setIndex(null);\n // Since it is a particle, normal is not necessary\n geo.deleteAttribute(\"normal\");\n return geo;\n }, [geometry]);\n\n const { material, modifiedPositions, modifiedUvs } = useMaterial({\n size,\n dpr: _dpr.shader,\n geometry: morphGeometry,\n positions,\n uvs,\n mapArray,\n uniforms,\n onBeforeCompile,\n });\n\n const { points, interactiveMesh } = useCreateObject({\n scene,\n geometry: morphGeometry,\n material,\n });\n\n const updateValue = setUniform(material);\n const 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 camera,\n geometry,\n positions,\n uvs,\n uniforms,\n onBeforeCompile,\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 uniforms,\n onBeforeCompile,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n });\n\n const updateFx = useCallback(\n (\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 { BufferGeometry, BufferAttribute, InterleavedBuffer, InterleavedBufferAttribute, TrianglesDrawMode, TriangleFanDrawMode, TriangleStripDrawMode, Vector3, Float32BufferAttribute } from \"three\";\nimport { getWithKey } from \"../types/helpers.js\";\nconst mergeBufferGeometries = (geometries, useGroups) => {\n const isIndexed = geometries[0].index !== null;\n const attributesUsed = new Set(Object.keys(geometries[0].attributes));\n const morphAttributesUsed = new Set(Object.keys(geometries[0].morphAttributes));\n const attributes = {};\n const morphAttributes = {};\n const morphTargetsRelative = geometries[0].morphTargetsRelative;\n const mergedGeometry = new BufferGeometry();\n let offset = 0;\n geometries.forEach((geom, i) => {\n let attributesCount = 0;\n if (isIndexed !== (geom.index !== null)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.\"\n );\n return null;\n }\n for (let name in geom.attributes) {\n if (!attributesUsed.has(name)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.'\n );\n return null;\n }\n if (attributes[name] === void 0) {\n attributes[name] = [];\n }\n attributes[name].push(geom.attributes[name]);\n attributesCount++;\n }\n if (attributesCount !== attributesUsed.size) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". Make sure all geometries have the same number of attributes.\"\n );\n return null;\n }\n if (morphTargetsRelative !== geom.morphTargetsRelative) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". .morphTargetsRelative must be consistent throughout all geometries.\"\n );\n return null;\n }\n for (let name in geom.morphAttributes) {\n if (!morphAttributesUsed.has(name)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". .morphAttributes must be consistent throughout all geometries.\"\n );\n return null;\n }\n if (morphAttributes[name] === void 0)\n morphAttributes[name] = [];\n morphAttributes[name].push(geom.morphAttributes[name]);\n }\n mergedGeometry.userData.mergedUserData = mergedGeometry.userData.mergedUserData || [];\n mergedGeometry.userData.mergedUserData.push(geom.userData);\n if (useGroups) {\n let count;\n if (geom.index) {\n count = geom.index.count;\n } else if (geom.attributes.position !== void 0) {\n count = geom.attributes.position.count;\n } else {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". The geometry must have either an index or a position attribute\"\n );\n return null;\n }\n mergedGeometry.addGroup(offset, count, i);\n offset += count;\n }\n });\n if (isIndexed) {\n let indexOffset = 0;\n const mergedIndex = [];\n geometries.forEach((geom) => {\n const index = geom.index;\n for (let j = 0; j < index.count; ++j) {\n mergedIndex.push(index.getX(j) + indexOffset);\n }\n indexOffset += geom.attributes.position.count;\n });\n mergedGeometry.setIndex(mergedIndex);\n }\n for (let name in attributes) {\n const mergedAttribute = mergeBufferAttributes(attributes[name]);\n if (!mergedAttribute) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the \" + name + \" attribute.\"\n );\n return null;\n }\n mergedGeometry.setAttribute(name, mergedAttribute);\n }\n for (let name in morphAttributes) {\n const numMorphTargets = morphAttributes[name][0].length;\n if (numMorphTargets === 0)\n break;\n mergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n mergedGeometry.morphAttributes[name] = [];\n for (let i = 0; i < numMorphTargets; ++i) {\n const morphAttributesToMerge = [];\n for (let j = 0; j < morphAttributes[name].length; ++j) {\n morphAttributesToMerge.push(morphAttributes[name][j][i]);\n }\n const mergedMorphAttribute = mergeBufferAttributes(morphAttributesToMerge);\n if (!mergedMorphAttribute) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the \" + name + \" morphAttribute.\"\n );\n return null;\n }\n mergedGeometry.morphAttributes[name].push(mergedMorphAttribute);\n }\n }\n return mergedGeometry;\n};\nconst mergeBufferAttributes = (attributes) => {\n let TypedArray = void 0;\n let itemSize = void 0;\n let normalized = void 0;\n let arrayLength = 0;\n attributes.forEach((attr) => {\n if (TypedArray === void 0) {\n TypedArray = attr.array.constructor;\n }\n if (TypedArray !== attr.array.constructor) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.\"\n );\n return null;\n }\n if (itemSize === void 0)\n itemSize = attr.itemSize;\n if (itemSize !== attr.itemSize) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.\"\n );\n return null;\n }\n if (normalized === void 0)\n normalized = attr.normalized;\n if (normalized !== attr.normalized) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.\"\n );\n return null;\n }\n arrayLength += attr.array.length;\n });\n if (TypedArray && itemSize) {\n const array = new TypedArray(arrayLength);\n let offset = 0;\n attributes.forEach((attr) => {\n array.set(attr.array, offset);\n offset += attr.array.length;\n });\n return new BufferAttribute(array, itemSize, normalized);\n }\n};\nconst interleaveAttributes = (attributes) => {\n let TypedArray = void 0;\n let arrayLength = 0;\n let stride = 0;\n for (let i = 0, l = attributes.length; i < l; ++i) {\n const attribute = attributes[i];\n if (TypedArray === void 0)\n TypedArray = attribute.array.constructor;\n if (TypedArray !== attribute.array.constructor) {\n console.error(\"AttributeBuffers of different types cannot be interleaved\");\n return null;\n }\n arrayLength += attribute.array.length;\n stride += attribute.itemSize;\n }\n const interleavedBuffer = new InterleavedBuffer(new TypedArray(arrayLength), stride);\n let offset = 0;\n const res = [];\n const getters = [\"getX\", \"getY\", \"getZ\", \"getW\"];\n const setters = [\"setX\", \"setY\", \"setZ\", \"setW\"];\n for (let j = 0, l = attributes.length; j < l; j++) {\n const attribute = attributes[j];\n const itemSize = attribute.itemSize;\n const count = attribute.count;\n const iba = new InterleavedBufferAttribute(interleavedBuffer, itemSize, offset, attribute.normalized);\n res.push(iba);\n offset += itemSize;\n for (let c = 0; c < count; c++) {\n for (let k = 0; k < itemSize; k++) {\n const set = getWithKey(iba, setters[k]);\n const get = getWithKey(attribute, getters[k]);\n set(c, get(c));\n }\n }\n }\n return res;\n};\nfunction estimateBytesUsed(geometry) {\n let mem = 0;\n for (let name in geometry.attributes) {\n const attr = geometry.getAttribute(name);\n mem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n }\n const indices = geometry.getIndex();\n mem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n return mem;\n}\nfunction mergeVertices(geometry, tolerance = 1e-4) {\n tolerance = Math.max(tolerance, Number.EPSILON);\n const hashToIndex = {};\n const indices = geometry.getIndex();\n const positions = geometry.getAttribute(\"position\");\n const vertexCount = indices ? indices.count : positions.count;\n let nextIndex = 0;\n const attributeNames = Object.keys(geometry.attributes);\n const attrArrays = {};\n const morphAttrsArrays = {};\n const newIndices = [];\n const getters = [\"getX\", \"getY\", \"getZ\", \"getW\"];\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n const name = attributeNames[i];\n attrArrays[name] = [];\n const morphAttr = geometry.morphAttributes[name];\n if (morphAttr) {\n morphAttrsArrays[name] = new Array(morphAttr.length).fill(0).map(() => []);\n }\n }\n const decimalShift = Math.log10(1 / tolerance);\n const shiftMultiplier = Math.pow(10, decimalShift);\n for (let i = 0; i < vertexCount; i++) {\n const index = indices ? indices.getX(i) : i;\n let hash = \"\";\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const itemSize = attribute.itemSize;\n for (let k = 0; k < itemSize; k++) {\n hash += `${~~(attribute[getters[k]](index) * shiftMultiplier)},`;\n }\n }\n if (hash in hashToIndex) {\n newIndices.push(hashToIndex[hash]);\n } else {\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const morphAttr = geometry.morphAttributes[name];\n const itemSize = attribute.itemSize;\n const newarray = attrArrays[name];\n const newMorphArrays = morphAttrsArrays[name];\n for (let k = 0; k < itemSize; k++) {\n const getterFunc = getters[k];\n newarray.push(attribute[getterFunc](index));\n if (morphAttr) {\n for (let m = 0, ml = morphAttr.length; m < ml; m++) {\n newMorphArrays[m].push(morphAttr[m][getterFunc](index));\n }\n }\n }\n }\n hashToIndex[hash] = nextIndex;\n newIndices.push(nextIndex);\n nextIndex++;\n }\n }\n const result = geometry.clone();\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n const name = attributeNames[i];\n const oldAttribute = geometry.getAttribute(name);\n const buffer = new oldAttribute.array.constructor(attrArrays[name]);\n const attribute = new BufferAttribute(buffer, oldAttribute.itemSize, oldAttribute.normalized);\n result.setAttribute(name, attribute);\n if (name in morphAttrsArrays) {\n for (let j = 0; j < morphAttrsArrays[name].length; j++) {\n const oldMorphAttribute = geometry.morphAttributes[name][j];\n const buffer2 = new oldMorphAttribute.array.constructor(morphAttrsArrays[name][j]);\n const morphAttribute = new BufferAttribute(buffer2, oldMorphAttribute.itemSize, oldMorphAttribute.normalized);\n result.morphAttributes[name][j] = morphAttribute;\n }\n }\n }\n result.setIndex(newIndices);\n return result;\n}\nfunction toTrianglesDrawMode(geometry, drawMode) {\n if (drawMode === TrianglesDrawMode) {\n console.warn(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.\");\n return geometry;\n }\n if (drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode) {\n let index = geometry.getIndex();\n if (index === null) {\n const indices = [];\n const position = geometry.getAttribute(\"position\");\n if (position !== void 0) {\n for (let i = 0; i < position.count; i++) {\n indices.push(i);\n }\n geometry.setIndex(indices);\n index = geometry.getIndex();\n } else {\n console.error(\n \"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.\"\n );\n return geometry;\n }\n }\n const numberOfTriangles = index.count - 2;\n const newIndices = [];\n if (index) {\n if (drawMode === TriangleFanDrawMode) {\n for (let i = 1; i <= numberOfTriangles; i++) {\n newIndices.push(index.getX(0));\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n }\n } else {\n for (let i = 0; i < numberOfTriangles; i++) {\n if (i % 2 === 0) {\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i + 2));\n } else {\n newIndices.push(index.getX(i + 2));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i));\n }\n }\n }\n }\n if (newIndices.length / 3 !== numberOfTriangles) {\n console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.\");\n }\n const newGeometry = geometry.clone();\n newGeometry.setIndex(newIndices);\n newGeometry.clearGroups();\n return newGeometry;\n } else {\n console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:\", drawMode);\n return geometry;\n }\n}\nfunction computeMorphedAttributes(object) {\n if (object.geometry.isBufferGeometry !== true) {\n console.error(\"THREE.BufferGeometryUtils: Geometry is not of type BufferGeometry.\");\n return null;\n }\n const _vA = new Vector3();\n const _vB = new Vector3();\n const _vC = new Vector3();\n const _tempA = new Vector3();\n const _tempB = new Vector3();\n const _tempC = new Vector3();\n const _morphA = new Vector3();\n const _morphB = new Vector3();\n const _morphC = new Vector3();\n function _calculateMorphedAttributeData(object2, material2, attribute, morphAttribute, morphTargetsRelative2, a2, b2, c2, modifiedAttributeArray) {\n _vA.fromBufferAttribute(attribute, a2);\n _vB.fromBufferAttribute(attribute, b2);\n _vC.fromBufferAttribute(attribute, c2);\n const morphInfluences = object2.morphTargetInfluences;\n if (\n // @ts-ignore\n material2.morphTargets && morphAttribute && morphInfluences\n ) {\n _morphA.set(0, 0, 0);\n _morphB.set(0, 0, 0);\n _morphC.set(0, 0, 0);\n for (let i2 = 0, il2 = morphAttribute.length; i2 < il2; i2++) {\n const influence = morphInfluences[i2];\n const morph = morphAttribute[i2];\n if (influence === 0)\n continue;\n _tempA.fromBufferAttribute(morph, a2);\n _tempB.fromBufferAttribute(morph, b2);\n _tempC.fromBufferAttribute(morph, c2);\n if (morphTargetsRelative2) {\n _morphA.addScaledVector(_tempA, influence);\n _morphB.addScaledVector(_tempB, influence);\n _morphC.addScaledVector(_tempC, influence);\n } else {\n _morphA.addScaledVector(_tempA.sub(_vA), influence);\n _morphB.addScaledVector(_tempB.sub(_vB), influence);\n _morphC.addScaledVector(_tempC.sub(_vC), influence);\n }\n }\n _vA.add(_morphA);\n _vB.add(_morphB);\n _vC.add(_morphC);\n }\n if (object2.isSkinnedMesh) {\n object2.boneTransform(a2, _vA);\n object2.boneTransform(b2, _vB);\n object2.boneTransform(c2, _vC);\n }\n modifiedAttributeArray[a2 * 3 + 0] = _vA.x;\n modifiedAttributeArray[a2 * 3 + 1] = _vA.y;\n modifiedAttributeArray[a2 * 3 + 2] = _vA.z;\n modifiedAttributeArray[b2 * 3 + 0] = _vB.x;\n modifiedAttributeArray[b2 * 3 + 1] = _vB.y;\n modifiedAttributeArray[b2 * 3 + 2] = _vB.z;\n modifiedAttributeArray[c2 * 3 + 0] = _vC.x;\n modifiedAttributeArray[c2 * 3 + 1] = _vC.y;\n modifiedAttributeArray[c2 * 3 + 2] = _vC.z;\n }\n const geometry = object.geometry;\n const material = object.material;\n let a, b, c;\n const index = geometry.index;\n const positionAttribute = geometry.attributes.position;\n const morphPosition = geometry.morphAttributes.position;\n const morphTargetsRelative = geometry.morphTargetsRelative;\n const normalAttribute = geometry.attributes.normal;\n const morphNormal = geometry.morphAttributes.position;\n const groups = geometry.groups;\n const drawRange = geometry.drawRange;\n let i, j, il, jl;\n let group, groupMaterial;\n let start, end;\n const modifiedPosition = new Float32Array(positionAttribute.count * positionAttribute.itemSize);\n const modifiedNormal = new Float32Array(normalAttribute.count * normalAttribute.itemSize);\n if (index !== null) {\n if (Array.isArray(material)) {\n for (i = 0, il = groups.length; i < il; i++) {\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n start = Math.max(group.start, drawRange.start);\n end = Math.min(group.start + group.count, drawRange.start + drawRange.count);\n for (j = start, jl = end; j < jl; j += 3) {\n a = index.getX(j);\n b = index.getX(j + 1);\n c = index.getX(j + 2);\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else {\n start = Math.max(0, drawRange.start);\n end = Math.min(index.count, drawRange.start + drawRange.count);\n for (i = start, il = end; i < il; i += 3) {\n a = index.getX(i);\n b = index.getX(i + 1);\n c = index.getX(i + 2);\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else if (positionAttribute !== void 0) {\n if (Array.isArray(material)) {\n for (i = 0, il = groups.length; i < il; i++) {\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n start = Math.max(group.start, drawRange.start);\n end = Math.min(group.start + group.count, drawRange.start + drawRange.count);\n for (j = start, jl = end; j < jl; j += 3) {\n a = j;\n b = j + 1;\n c = j + 2;\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else {\n start = Math.max(0, drawRange.start);\n end = Math.min(positionAttribute.count, drawRange.start + drawRange.count);\n for (i = start, il = end; i < il; i += 3) {\n a = i;\n b = i + 1;\n c = i + 2;\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n }\n const morphedPositionAttribute = new Float32BufferAttribute(modifiedPosition, 3);\n const morphedNormalAttribute = new Float32BufferAttribute(modifiedNormal, 3);\n return {\n positionAttribute,\n normalAttribute,\n morphedPositionAttribute,\n morphedNormalAttribute\n };\n}\nfunction toCreasedNormals(geometry, creaseAngle = Math.PI / 3) {\n const creaseDot = Math.cos(creaseAngle);\n const hashMultiplier = (1 + 1e-10) * 100;\n const verts = [new Vector3(), new Vector3(), new Vector3()];\n const tempVec1 = new Vector3();\n const tempVec2 = new Vector3();\n const tempNorm = new Vector3();\n const tempNorm2 = new Vector3();\n function hashVertex(v) {\n const x = ~~(v.x * hashMultiplier);\n const y = ~~(v.y * hashMultiplier);\n const z = ~~(v.z * hashMultiplier);\n return `${x},${y},${z}`;\n }\n const resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;\n const posAttr = resultGeometry.attributes.position;\n const vertexMap = {};\n for (let i = 0, l = posAttr.count / 3; i < l; i++) {\n const i3 = 3 * i;\n const a = verts[0].fromBufferAttribute(posAttr, i3 + 0);\n const b = verts[1].fromBufferAttribute(posAttr, i3 + 1);\n const c = verts[2].fromBufferAttribute(posAttr, i3 + 2);\n tempVec1.subVectors(c, b);\n tempVec2.subVectors(a, b);\n const normal = new Vector3().crossVectors(tempVec1, tempVec2).normalize();\n for (let n = 0; n < 3; n++) {\n const vert = verts[n];\n const hash = hashVertex(vert);\n if (!(hash in vertexMap)) {\n vertexMap[hash] = [];\n }\n vertexMap[hash].push(normal);\n }\n }\n const normalArray = new Float32Array(posAttr.count * 3);\n const normAttr = new BufferAttribute(normalArray, 3, false);\n for (let i = 0, l = posAttr.count / 3; i < l; i++) {\n const i3 = 3 * i;\n const a = verts[0].fromBufferAttribute(posAttr, i3 + 0);\n const b = verts[1].fromBufferAttribute(posAttr, i3 + 1);\n const c = verts[2].fromBufferAttribute(posAttr, i3 + 2);\n tempVec1.subVectors(c, b);\n tempVec2.subVectors(a, b);\n tempNorm.crossVectors(tempVec1, tempVec2).normalize();\n for (let n = 0; n < 3; n++) {\n const vert = verts[n];\n const hash = hashVertex(vert);\n const otherNormals = vertexMap[hash];\n tempNorm2.set(0, 0, 0);\n for (let k = 0, lk = otherNormals.length; k < lk; k++) {\n const otherNorm = otherNormals[k];\n if (tempNorm.dot(otherNorm) > creaseDot) {\n tempNorm2.add(otherNorm);\n }\n }\n tempNorm2.normalize();\n normAttr.setXYZ(i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z);\n }\n }\n resultGeometry.setAttribute(\"normal\", normAttr);\n return resultGeometry;\n}\nexport {\n computeMorphedAttributes,\n estimateBytesUsed,\n interleaveAttributes,\n mergeBufferAttributes,\n mergeBufferGeometries,\n mergeVertices,\n toCreasedNormals,\n toTrianglesDrawMode\n};\n//# sourceMappingURL=BufferGeometryUtils.js.map\n","#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 { useMemo } from \"react\";\nimport transmission_pars_fragment from \"./shaders/transmission_pars_fragment.glsl\";\nimport transmission_fragment from \"./shaders/transmission_fragment.glsl\";\nimport { WOBBLE3D_PARAMS } from \".\";\nimport { MaterialProps } from \"../../types\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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\n/** You also need to rewrite the vertext shader of depthMaterial */\nconst rewriteVertex = (vertex: string) => {\n let shader = vertex;\n shader = shader.replace(\n \"#include \",\n `\n\t\tvec3 objectNormal = usf_Normal;\n\t\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t\t#endif`\n );\n // position\n shader = shader.replace(\n \"#include \",\n `\n\t\tvec3 transformed = usf_Position;`\n );\n\n // uniforms\n shader = shader.replace(\n \"void main() {\",\n `\n\t\tuniform float uTime;\n\t\tuniform float uWobblePositionFrequency;\n\t\tuniform float uWobbleTimeFrequency;\n\t\tuniform float uWobbleStrength;\n\t\tuniform float uWarpPositionFrequency;\n\t\tuniform float uWarpTimeFrequency;\n\t\tuniform float uWarpStrength;\n\t\tattribute vec4 tangent;\n\t\tvarying float vWobble;\n\t\tvarying vec2 vPosition;\n\t\t// edge\n\t\tvarying vec3 vEdgeNormal;\n\t\tvarying vec3 vEdgeViewPosition;\n\t\t#usf \n\t\tvoid main() {\n\t\t`\n );\n\n // vert\n shader = shader.replace(\n \"void main() {\",\n `\n\t\tvoid main() {\n\t\tvec3 usf_Position = position;\n\t\tvec3 usf_Normal = normal;\n\t\tvec3 biTangent = cross(normal, tangent.xyz);\n\t\t\n\t\t// Neighbours positions\n\t\tfloat shift = 0.01;\n\t\tvec3 positionA = usf_Position + tangent.xyz * shift;\n\t\tvec3 positionB = usf_Position + biTangent * shift;\n\t\t\n\t\t// wobble\n\t\tfloat wobble = (uWobbleStrength > 0.) ? getWobble(usf_Position) : 0.0;\n\t\tfloat wobblePositionA = (uWobbleStrength > 0.) ? getWobble(positionA) : 0.0;\n\t\tfloat wobblePositionB = (uWobbleStrength > 0.) ? getWobble(positionB) : 0.0;\n\t\t\n\t\tusf_Position += wobble * normal;\n\t\tpositionA += wobblePositionA * normal;\n\t\tpositionB += wobblePositionB * normal;\n\n\t\t// Compute normal\n\t\tvec3 toA = normalize(positionA - usf_Position);\n\t\tvec3 toB = normalize(positionB - usf_Position);\n\t\tusf_Normal = cross(toA, toB);\n\t\t\n\t\t// Varying\n\t\tvPosition = usf_Position.xy;\n\t\tvWobble = wobble/uWobbleStrength;\n\t\t\n\t\tvEdgeNormal = normalize(normalMatrix * usf_Normal);\n\t\tvec4 viewPosition = viewMatrix * modelMatrix * vec4(usf_Position, 1.0);\n\t\tvEdgeViewPosition = normalize(viewPosition.xyz);\n\t\t`\n );\n return shader;\n};\n\nexport type WobbleMaterialConstructor = new (opts: {\n [key: string]: any;\n}) => THREE.Material;\ntype WobbleMaterialParams =\n ConstructorParameters[0];\nexport interface WobbleMaterialProps\n extends MaterialProps {\n /** default:THREE.MeshPhysicalMaterial */\n baseMaterial?: T;\n materialParameters?: WobbleMaterialParams;\n /**\n * depthMaterial's onBeforeCompile\n * @param parameters — WebGL program parameters\n * @param renderer — WebGLRenderer Context that is initializing the material\n */\n depthOnBeforeCompile?: (\n parameters: THREE.WebGLProgramParametersWithUniforms,\n renderer: THREE.WebGLRenderer\n ) => 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 onBeforeCompile,\n depthOnBeforeCompile,\n isCustomTransmission = false,\n uniforms,\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 ...uniforms,\n },\n });\n\n mat.onBeforeCompile = (parameters, renderer) => {\n Object.assign(parameters.uniforms, mat.userData.uniforms);\n\n /********************\n\t\t\tvert\n\t\t\t********************/\n parameters.vertexShader = rewriteVertex(parameters.vertexShader);\n\n /********************\n\t\t\tfrag\n\t\t\t********************/\n // diffuse color , Manipulate color mixing ratio with `uColorMix`\n parameters.fragmentShader = parameters.fragmentShader.replace(\n \"#include \",\n `\n\t\t\t\t\t#include \n\n\t\t\t\t\tif (uEdgeThreshold > 0.0) {\n\t\t\t\t\t\tfloat edgeThreshold = dot(vEdgeNormal, -vEdgeViewPosition);\n\t\t\t\t\t\tdiffuseColor = edgeThreshold < uEdgeThreshold ? vec4(uEdgeColor, 1.0) : mix(diffuseColor, usf_DiffuseColor, uColorMix);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdiffuseColor = mix(diffuseColor, usf_DiffuseColor, uColorMix);\n\t\t\t\t\t}\n\t\t\t\t`\n );\n\n // frag\n parameters.fragmentShader = parameters.fragmentShader.replace(\n \"void main() {\",\n `\n\t\t\t\tuniform vec3 uColor0;\n\t\t\t\tuniform vec3 uColor1;\n\t\t\t\tuniform vec3 uColor2;\n\t\t\t\tuniform vec3 uColor3;\n\t\t\t\tuniform float uColorMix;\n\t\t\t\tuniform float uEdgeThreshold;\n\t\t\t\tuniform vec3 uEdgeColor;\n\t\t\t\t\n\t\t\t\t// transmission\n\t\t\t\tuniform float uChromaticAberration; \n\t\t\t\tuniform float uAnisotropicBlur; \n\t\t\t\tuniform float uTime;\n\t\t\t\tuniform float uDistortion;\n\t\t\t\tuniform float uDistortionScale;\n\t\t\t\tuniform float uTemporalDistortion;\n\t\t\t\tuniform float uRefractionSamples;\n\t\t\t\t\n\t\t\t\tfloat rand(float n){return fract(sin(n) * 43758.5453123);}\n\t\t\t\t#usf \n\n\t\t\t\tvarying float vWobble;\n\t\t\t\tvarying vec2 vPosition;\n\t\t\t\tvarying vec3 vEdgeNormal;\n\t\t\t\tvarying vec3 vEdgeViewPosition;\n\t\t\t\t\n\t\t\t\tvoid main(){\n\t\t\t\t\tvec4 usf_DiffuseColor = vec4(1.0);\n\t\t\t\t\tfloat colorWobbleMix = smoothstep(-1.,1.,vWobble);\n\t\t\t\t\tvec2 colorPosMix = vec2(smoothstep(-1.,1.,vPosition.x),smoothstep(-1.,1.,vPosition.y));\n\t\t\t\t\n\t\t\t\t\tusf_DiffuseColor.rgb = mix(mix(uColor0, uColor1, colorPosMix.x), mix(uColor2, uColor3, colorPosMix.y), colorWobbleMix);\n\t\t\t\t`\n );\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 setOnBeforeCompile(onBeforeCompile)(parameters, renderer);\n };\n mat.needsUpdate = true;\n\n /*===============================================\n\t\tdepthMaterial\n\t\t===============================================*/\n const depthMat = new THREE.MeshDepthMaterial({\n depthPacking: THREE.RGBADepthPacking,\n });\n depthMat.onBeforeCompile = (parameters, renderer) => {\n Object.assign(parameters.uniforms, mat.userData.uniforms);\n parameters.vertexShader = rewriteVertex(parameters.vertexShader);\n setOnBeforeCompile(depthOnBeforeCompile)(parameters, renderer);\n };\n depthMat.needsUpdate = true;\n\n return { material: mat, depthMaterial: depthMat };\n }, [\n materialParameters,\n baseMaterial,\n onBeforeCompile,\n depthOnBeforeCompile,\n uniforms,\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 onBeforeCompile,\n depthOnBeforeCompile,\n uniforms,\n}: UseCreateWobble3DProps &\n Create3DHooksProps &\n WobbleMaterialProps): UseCreateWobble3DReturn => {\n const wobbleGeometry = useMemo(() => {\n let geo = geometry || new THREE.IcosahedronGeometry(2, 20);\n geo = mergeVertices(geo);\n geo.computeTangents();\n return geo;\n }, [geometry]);\n const { material, depthMaterial } = useMaterial({\n baseMaterial,\n materialParameters,\n onBeforeCompile,\n depthOnBeforeCompile,\n uniforms,\n isCustomTransmission,\n });\n\n const mesh = useAddObject(scene, wobbleGeometry, material, THREE.Mesh);\n\n const userData = material.userData as Wobble3DMaterial;\n const updateValue = setUniform(userData);\n const 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 isSizeUpdate,\n camera,\n geometry,\n baseMaterial,\n materialParameters,\n uniforms,\n onBeforeCompile,\n depthOnBeforeCompile,\n isCustomTransmission,\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 uniforms,\n onBeforeCompile,\n depthOnBeforeCompile,\n isCustomTransmission,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n });\n\n const updateFx = useCallback(\n (\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","export type EasingTypes =\n | \"easeInSine\"\n | \"easeOutSine\"\n | \"easeInOutSine\"\n | \"easeInQuad\"\n | \"easeOutQuad\"\n | \"easeInOutQuad\"\n | \"easeInCubic\"\n | \"easeOutCubic\"\n | \"easeInOutCubic\"\n | \"easeInQuart\"\n | \"easeOutQuart\"\n | \"easeInOutQuart\"\n | \"easeInQuint\"\n | \"easeOutQuint\"\n | \"easeInOutQuint\"\n | \"easeInExpo\"\n | \"easeOutExpo\"\n | \"easeInOutExpo\"\n | \"easeInCirc\"\n | \"easeOutCirc\"\n | \"easeInOutCirc\"\n | \"easeInBack\"\n | \"easeOutBack\"\n | \"easeInOutBack\"\n | \"easeInElastic\"\n | \"easeOutElastic\"\n | \"easeInOutElastic\"\n | \"easeInBounce\"\n | \"easeOutBounce\"\n | \"easeInOutBounce\";\n\ntype EasingFunctions = {\n [K in EasingTypes]: (x: number) => number;\n};\n\n/**\n * from https://github.com/ai/easings.net\n */\nexport const Easing: EasingFunctions = Object.freeze({\n easeInSine(x: number): number {\n return 1 - Math.cos((x * Math.PI) / 2);\n },\n easeOutSine(x: number): number {\n return Math.sin((x * Math.PI) / 2);\n },\n easeInOutSine(x: number): number {\n return -(Math.cos(Math.PI * x) - 1) / 2;\n },\n easeInQuad(x: number): number {\n return x * x;\n },\n easeOutQuad(x: number): number {\n return 1 - (1 - x) * (1 - x);\n },\n easeInOutQuad(x: number): number {\n return x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2;\n },\n easeInCubic(x: number): number {\n return x * x * x;\n },\n easeOutCubic(x: number): number {\n return 1 - Math.pow(1 - x, 3);\n },\n easeInOutCubic(x: number): number {\n return x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2;\n },\n easeInQuart(x: number): number {\n return x * x * x * x;\n },\n easeOutQuart(x: number): number {\n return 1 - Math.pow(1 - x, 4);\n },\n easeInOutQuart(x: number): number {\n return x < 0.5 ? 8 * x * x * x * x : 1 - Math.pow(-2 * x + 2, 4) / 2;\n },\n easeInQuint(x: number): number {\n return x * x * x * x * x;\n },\n easeOutQuint(x: number): number {\n return 1 - Math.pow(1 - x, 5);\n },\n easeInOutQuint(x: number): number {\n return x < 0.5 ? 16 * x * x * x * x * x : 1 - Math.pow(-2 * x + 2, 5) / 2;\n },\n easeInExpo(x: number): number {\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\n },\n easeOutExpo(x: number): number {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n },\n easeInOutExpo(x: number): number {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? Math.pow(2, 20 * x - 10) / 2\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\n },\n easeInCirc(x: number): number {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n },\n easeOutCirc(x: number): number {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n },\n easeInOutCirc(x: number): number {\n return x < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\n },\n easeInBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return c3 * x * x * x - c1 * x * x;\n },\n easeOutBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return 1 + c3 * Math.pow(x - 1, 3) + c1 * Math.pow(x - 1, 2);\n },\n easeInOutBack(x: number): number {\n const c1 = 1.70158;\n const c2 = c1 * 1.525;\n\n return x < 0.5\n ? (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2\n : (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2;\n },\n easeInElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\n },\n easeOutElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1;\n },\n easeInOutElastic(x: number): number {\n const c5 = (2 * Math.PI) / 4.5;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * c5)) / 2\n : (Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * c5)) / 2 +\n 1;\n },\n easeInBounce(x: number): number {\n return 1 - Easing.easeOutBounce(1 - x);\n },\n easeOutBounce(x: number): number {\n const n1 = 7.5625;\n const d1 = 2.75;\n\n if (x < 1 / d1) {\n return n1 * x * x;\n } else if (x < 2 / d1) {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n } else if (x < 2.5 / d1) {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n } else {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n },\n easeInOutBounce(x: number): number {\n return x < 0.5\n ? (1 - Easing.easeOutBounce(1 - 2 * x)) / 2\n : (1 + Easing.easeOutBounce(2 * x - 1)) / 2;\n },\n});\n","import * as THREE from \"three\";\nimport { Easing, EasingTypes } from \"../libs/easing\";\nimport { useCallback } from \"react\";\n\n/** Returns a unique hash specific to the beat */\nfunction getHash(input: number) {\n let n = Math.sin(input * 12.9898) * 43758.5453;\n return n - Math.floor(n);\n}\n\ntype BeatValues = {\n beat: number;\n floor: number;\n fract: number;\n /** unique hash specific to the beat */\n hash: number;\n};\n\n/**\n * @param ease easing functions are referenced from https://github.com/ai/easings.net , default : \"easeOutQuart\"\n */\nexport const useBeat = (bpm: number, ease: EasingTypes = \"easeOutQuart\") => {\n const rhythm = bpm / 60;\n const easing = Easing[ease];\n const updateBeat = useCallback(\n (clock: THREE.Clock) => {\n let beat = clock.getElapsedTime() * rhythm;\n const floor = Math.floor(beat);\n const fract = easing(beat - floor);\n beat = fract + floor;\n const hash = getHash(floor);\n return {\n beat,\n floor,\n fract,\n hash,\n } as BeatValues;\n },\n [rhythm, easing]\n );\n return updateBeat;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo, useRef } from \"react\";\n\n/**\n * @param fps FPS you want to limit , default : `60`\n *\n * ```tsx\n * const limiter = useFPSLimiter(fps);\n * useFrame((props) => {\n * if (limiter(props.clock)) {\n *\t\t //some code\n * }\n * });\n * ```\n */\nexport const useFPSLimiter = (fps: number = 60) => {\n const interval = useMemo(() => 1 / Math.max(Math.min(fps, 60), 1), [fps]);\n const prevTime = useRef(null);\n\n const limiter = useCallback(\n (clock: THREE.Clock) => {\n const tick = clock.getElapsedTime();\n if (prevTime.current === null) {\n prevTime.current = tick;\n return true;\n }\n const deltaTime = tick - prevTime.current;\n if (deltaTime >= interval) {\n prevTime.current = tick;\n return true;\n }\n return false;\n },\n [interval]\n );\n\n return limiter;\n};\n","import { DomSyncerParams } from \"..\";\n\nexport const errorHandler = (params: DomSyncerParams) => {\n const domLength = params.dom?.length;\n const textureLength = params.texture?.length;\n\n if (!domLength || !textureLength) {\n return true;\n }\n\n if (domLength !== textureLength) {\n return true;\n }\n\n return false;\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec2 u_textureResolution;\nuniform vec2 u_resolution;\nuniform float u_borderRadius;\n\nvoid main() {\n\t// texuture color\n\tfloat screenAspect = u_resolution.x / u_resolution.y;\n\tfloat textureAspect = u_textureResolution.x / u_textureResolution.y;\n\tvec2 ratio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\n\tvec2 adjustedUv = vUv * ratio + (1.0 - ratio) * 0.5;\n\tvec3 textureColor = texture2D(u_texture, adjustedUv).rgb;\n\tfloat textureAlpha = texture2D(u_texture, adjustedUv).a;\n\n\t// Based on https://mofu-dev.com/en/blog/three-dom-alignment/\n\tfloat maxSide = max(u_resolution.x, u_resolution.y);\n\tfloat minSide = min(u_resolution.x, u_resolution.y);\n\tvec2 aspect = u_resolution / maxSide;\n\tvec2 alphaUv = vUv - 0.5;\n\n\tfloat borderRadius = min(u_borderRadius, minSide * 0.5);\n\tvec2 offset = vec2(borderRadius) / u_resolution;\n\tvec2 alphaXY = smoothstep(vec2(0.5 - offset), vec2(0.5 - offset - 0.001), abs(alphaUv));\n\tfloat alpha = min(1.0, alphaXY.x + alphaXY.y);\n\n\tvec2 alphaUv2 = abs(vUv - 0.5);\n\tfloat radius = borderRadius / maxSide;\n\talphaUv2 = (alphaUv2 - 0.5) * aspect + radius;\n\tfloat roundAlpha = smoothstep(radius + 0.001, radius, length(alphaUv2));\n\n\talpha = min(1.0, alpha + roundAlpha);\n\n\t// multiply texture alpha\n\talpha *= textureAlpha;\n\n\tgl_FragColor = vec4(textureColor, alpha);\n}\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"../\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"../shader/main.vert\";\nimport fragmentShader from \"../shader/main.frag\";\nimport { MaterialProps } from \"../../../fxs/types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../libs/constants\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n params: DomSyncerParams;\n size: Size;\n scene: THREE.Scene;\n} & MaterialProps) => {\n if (scene.children.length > 0) {\n scene.children.forEach((child) => {\n if (child instanceof THREE.Mesh) {\n child.geometry.dispose();\n child.material.dispose();\n }\n });\n scene.remove(...scene.children);\n }\n\n params.texture!.forEach((texture, i) => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: texture },\n u_textureResolution: {\n value: new THREE.Vector2(0, 0),\n },\n u_resolution: { value: new THREE.Vector2(0, 0) },\n u_borderRadius: {\n value: params.boderRadius![i] ? params.boderRadius![i] : 0.0,\n },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent.\n transparent: true,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n const mesh = new THREE.Mesh(new THREE.PlaneGeometry(1, 1), mat);\n scene.add(mesh);\n });\n};\n","import { useCallback, useRef } from \"react\";\nimport { DomSyncerParams } from \"..\";\n\nexport const useIntersectionHandler = () => {\n const intersectionObserverRef = useRef([]);\n const intersectionDomRef = useRef<(HTMLElement | Element | null)[]>([]);\n\n const intersectionHandler = useCallback(\n ({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n }: {\n isIntersectingRef: React.MutableRefObject;\n isIntersectingOnceRef: React.MutableRefObject;\n params: DomSyncerParams;\n }) => {\n if (intersectionObserverRef.current.length > 0) {\n intersectionObserverRef.current.forEach((observer, i) => {\n observer.unobserve(intersectionDomRef.current[i]!);\n });\n }\n\n intersectionDomRef.current = [];\n intersectionObserverRef.current = [];\n\n const newArr = new Array(params.dom!.length).fill(false);\n isIntersectingRef.current = [...newArr];\n isIntersectingOnceRef.current = [...newArr];\n\n params.dom!.forEach((dom, i) => {\n const callback = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n params.onIntersect![i] && params.onIntersect![i](entry);\n // Update the judgment after execution so that the judgment of isIntersectin can be used when executing onIntersect\n isIntersectingRef.current[i] = entry.isIntersecting;\n });\n };\n const observer = new IntersectionObserver(callback, {\n rootMargin: \"0px\",\n threshold: 0,\n });\n observer.observe(dom!);\n intersectionObserverRef.current.push(observer);\n intersectionDomRef.current.push(dom!);\n });\n },\n []\n );\n\n return intersectionHandler;\n};\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"..\";\nimport { Size } from \"@react-three/fiber\";\nimport {\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, samples, isSizeUpdate, uniforms, onBeforeCompile }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n const [params, setParams] = useParams({\n ...DOMSYNCER_PARAMS,\n updateKey: performance.now(),\n });\n\n const [DOMRects, updateDomRects] = useUpdateDomRect();\n\n // Avoid instancing vec2 every frame\n const resolutionRef = useRef(new THREE.Vector2(0, 0));\n\n // Update monitored doms according to the dependency array\n const [refreshTrigger, setRefreshTrigger] = useState(true);\n useMemo(\n () => setRefreshTrigger(true),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n dependencies\n );\n\n // If the dependencies have been updated but the key has not been updated, skip processing and return an empty texture\n const updateKey = useRef(null);\n const emptyTexture = useMemo(() => 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 uniforms,\n onBeforeCompile,\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 uniforms,\n intersectionHandler,\n onBeforeCompile,\n refreshTrigger,\n scene,\n params,\n isIntersectingOnceRef,\n isIntersectingRef,\n emptyTexture,\n updateParams,\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 { UseFboProps, renderFBO, FBO_OPTION } from \"../utils/useSingleFBO\";\n\ntype UpdateCopyFunction = (\n gl: THREE.WebGLRenderer,\n index: number,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseCopyTextureReturn = [THREE.WebGLRenderTarget[], UpdateCopyFunction];\n\n/**\n * Generate an FBO array to copy the texture.\n * @param dpr If dpr is set, dpr will be multiplied, default : `false`\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false`\n * @param length The number of FBOs to create\n * @returns [THREE.WebGLRenderTarget[] , updateCopyTexture] - Receives the RenderTarget array as the first argument and the update function as the second argument. `updateCopyTexture()` receives gl as the first argument and the index of the texture you want to copy as the second argument.\n */\nexport const useCopyTexture = (\n {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n }: UseFboProps,\n length: number\n): UseCopyTextureReturn => {\n const renderTargetArr = useRef([]);\n const resolution = useResolution(size, dpr);\n\n renderTargetArr.current = useMemo(() => {\n return Array.from({ length }, () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [length]);\n\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","setUniform","material","key","value","uniforms","setCustomUniform","customParams","useAddObject","scene","geometry","Proto","object3D","obj","useEffect","ISDEV","MATERIAL_BASIC_PARAMS","DEFAULT_TEXTURE","wobble3D_default","snoise_default","coverTexture_default","fxBlending_default","planeVert_default","SHADER_CHUNK","wobble3D","snoise","coverTexture","fxBlending","planeVert","includePattern","includeReplacer","match","include","string","resolveIncludes","resolveShaders","parameters","setOnBeforeCompile","onBeforeCompile","renderer","useMesh","mat","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_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","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","iterations","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","mergeVertices","tolerance","hashToIndex","indices","vertexCount","nextIndex","attributeNames","attrArrays","morphAttrsArrays","newIndices","getters","l","name","morphAttr","decimalShift","shiftMultiplier","hash","k","newarray","newMorphArrays","getterFunc","m","ml","result","oldAttribute","buffer","BufferAttribute","oldMorphAttribute","buffer2","morphAttribute","transmission_pars_fragment_default","transmission_fragment_default","rewriteVertex","vertex","shader","baseMaterial","materialParameters","depthOnBeforeCompile","isCustomTransmission","depthMaterial","WOBBLE3D_PARAMS","transmission_pars_fragment","transmission_fragment","depthMat","useCreateWobble3D","wobbleGeometry","userData","useWobble3D","RootState","useAddMesh","Easing","x","c2","c4","c5","getHash","input","n","useBeat","bpm","ease","rhythm","easing","beat","floor","fract","useFPSLimiter","fps","interval","prevTime","tick","errorHandler","domLength","textureLength","createMesh","child","useIntersectionHandler","intersectionObserverRef","intersectionDomRef","isIntersectingRef","isIntersectingOnceRef","observer","newArr","dom","callback","entries","entry","useUpdateDomRect","domRects","updateDomRects","resolutionRef","domElement","rect","useIsIntersecting","isIntersecting","once","createUseDomView","onView","onHidden","isView","id","filterIntersection","item","DOMSYNCER_PARAMS","useDomSyncer","dependencies","DOMRects","refreshTrigger","setRefreshTrigger","useState","updateKey","emptyTexture","intersectionHandler","useDomView","useCopyTexture","length","renderTargetArr","updateCopyTexture"],"mappings":"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","x_google_ignoreList":[123]} \ No newline at end of file diff --git a/packages/use-shader-fx/build/use-shader-fx.umd.cjs.map b/packages/use-shader-fx/build/use-shader-fx.umd.cjs.map index 172fa0f9..d929d385 100644 --- a/packages/use-shader-fx/build/use-shader-fx.umd.cjs.map +++ b/packages/use-shader-fx/build/use-shader-fx.umd.cjs.map @@ -1 +1 @@ -{"version":3,"file":"use-shader-fx.umd.cjs","sources":["../src/fxs/interactions/useBrush/shader/main.vert","../src/fxs/interactions/useBrush/shader/main.frag","../src/utils/useResolution.ts","../src/utils/setUniforms.ts","../src/utils/useAddObject.ts","../src/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/planeVert.glsl","../src/libs/shaders/resolveShaders.ts","../src/utils/setOnBeforeCompile.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","../node_modules/three-stdlib/utils/BufferGeometryUtils.js","../src/fxs/3D/useWobble3D/shaders/transmission_pars_fragment.glsl","../src/fxs/3D/useWobble3D/shaders/transmission_fragment.glsl","../src/fxs/3D/useWobble3D/useMaterial.ts","../src/fxs/3D/useWobble3D/useCreateWobble3D.ts","../src/fxs/3D/useWobble3D/index.ts","../src/utils/useAddMesh.ts","../src/libs/easing.ts","../src/misc/useBeat.ts","../src/misc/useFPSLimiter.ts","../src/misc/useDomSyncer/utils/errorHandler.ts","../src/misc/useDomSyncer/shader/main.vert","../src/misc/useDomSyncer/shader/main.frag","../src/misc/useDomSyncer/utils/createMesh.ts","../src/misc/useDomSyncer/utils/useIntersectionHandler.ts","../src/misc/useDomSyncer/utils/useUpdateDomRect.ts","../src/misc/useDomSyncer/utils/useIsIntersecting.ts","../src/misc/useDomSyncer/utils/createUseDomView.ts","../src/misc/useDomSyncer/index.ts","../src/misc/useCopyTexture.ts"],"sourcesContent":["#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 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}","import * as THREE from \"three\";\n\nimport wobble3D from \"./shaderChunk/wobble3D.glsl\";\nimport snoise from \"./shaderChunk/snoise.glsl\";\nimport coverTexture from \"./shaderChunk/coverTexture.glsl\";\nimport fxBlending from \"./shaderChunk/fxBlending.glsl\";\nimport planeVert from \"./shaderChunk/planeVert.glsl\";\n\nconst SHADER_CHUNK: { [key: string]: string } = {\n wobble3D,\n snoise,\n coverTexture,\n fxBlending,\n planeVert,\n};\n\nconst includePattern = /^[ \\t]*#usf +<([\\w\\d./]+)>/gm;\n\nfunction includeReplacer(match: string, include: string) {\n let string = SHADER_CHUNK[include] || \"\";\n return resolveIncludes(string);\n}\n\nfunction resolveIncludes(string: string) {\n return string.replace(includePattern, includeReplacer);\n}\n\nexport const resolveShaders = (\n parameters: THREE.WebGLProgramParametersWithUniforms\n) => {\n parameters.vertexShader = resolveIncludes(parameters.vertexShader);\n parameters.fragmentShader = resolveIncludes(parameters.fragmentShader);\n};\n","import * as THREE from \"three\";\nimport { resolveShaders } from \"../libs/shaders/resolveShaders\";\n\ntype OnBeforeCompile = (\n parameters: THREE.WebGLProgramParametersWithUniforms,\n renderer: THREE.WebGLRenderer\n) => void;\n\nexport const setOnBeforeCompile = (\n onBeforeCompile?: OnBeforeCompile\n): OnBeforeCompile => {\n return (parameters, renderer) => {\n onBeforeCompile && onBeforeCompile(parameters, renderer);\n resolveShaders(parameters);\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 { 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uBuffer: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent\n transparent: true,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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_OPTION: THREE.RenderTargetOptions = {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n type: THREE.HalfFloatType,\n stencilBuffer: false,\n};\n\nexport type UseFboProps = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n size: Size;\n /** If dpr is set, dpr will be multiplied, default : `false` */\n dpr?: number | false;\n /** Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false` */\n isSizeUpdate?: boolean;\n /** Defines the count of MSAA samples. Can only be used with WebGL 2. default : `0.0` */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, default : `false` */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. default : `false` */\n depthTexture?: boolean;\n};\n\nexport const renderFBO = ({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender,\n onSwap,\n}: {\n gl: THREE.WebGLRenderer;\n fbo: THREE.WebGLRenderTarget;\n scene: THREE.Scene;\n camera: THREE.Camera;\n onBeforeRender: () => void;\n onSwap?: () => void;\n}) => {\n gl.setRenderTarget(fbo);\n onBeforeRender();\n gl.clear();\n gl.render(scene, camera);\n onSwap && onSwap();\n gl.setRenderTarget(null);\n gl.clear();\n};\n\ntype UpdateRenderTarget = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseSingleFBOReturn = [THREE.WebGLRenderTarget, UpdateRenderTarget];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [THREE.WebGLRenderTarget , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useSingleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseSingleFBOReturn => {\n const renderTarget = useRef();\n\n const resolution = useResolution(size, dpr);\n\n renderTarget.current = useMemo(\n () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { FBO_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget | null;\n write: THREE.WebGLRenderTarget | null;\n};\n\ninterface WebGLDoubleRenderTarget extends DoubleRenderTarget {\n swap: () => void;\n}\n\ntype FBOUpdateFunction = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({\n read,\n write,\n }: {\n read: THREE.Texture;\n write: THREE.Texture;\n }) => void\n) => THREE.Texture;\n\ntype UseDoubleFBOReturn = [\n { read: THREE.WebGLRenderTarget; write: THREE.WebGLRenderTarget },\n FBOUpdateFunction\n];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default : `false`\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false`\n * @returns [{read:THREE.WebGLRenderTarget,write:THREE.WebGLRenderTarget} , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useDoubleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseDoubleFBOReturn => {\n const renderTarget = useRef({\n read: null,\n write: null,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n });\n\n const resolution = useResolution(size, dpr);\n\n const initRenderTargets = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n\n if (depthTexture) {\n read.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n write.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n\n return { read, write };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n renderTarget.current.read = initRenderTargets.read;\n renderTarget.current.write = initRenderTargets.write;\n\n if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, []);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current;\n renderFBO({\n gl,\n scene,\n camera,\n fbo: fbo.write!,\n onBeforeRender: () =>\n onBeforeRender &&\n onBeforeRender({\n read: fbo.read!.texture,\n write: fbo.write!.texture,\n }),\n onSwap: () => fbo.swap(),\n });\n return fbo.read?.texture as THREE.Texture;\n },\n [scene, camera]\n );\n\n return [\n { read: renderTarget.current.read, write: renderTarget.current.write },\n updateRenderTarget,\n ];\n};\n","import { Dpr } from \"../fxs/types\";\n\nexport const getDpr = (\n dpr: Dpr\n): { shader: number | false; fbo: number | false } => {\n if (typeof dpr === \"number\") {\n return { shader: dpr, fbo: dpr };\n }\n return {\n shader: dpr.shader ?? false,\n fbo: dpr.fbo ?? false,\n };\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { PointerValues, usePointer } from \"../../../misc/usePointer\";\nimport {\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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const pressureEnd = useRef(null);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class AdvectionMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uSource: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n dt: { value: number };\n dissipation: { value: number };\n };\n}\n\nexport const useAdvectionMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class DivergenceMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useDivergenceMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const divergenceMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class PressureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uDivergence: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const usePressureMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const pressureMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: null },\n uDivergence: { value: null },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class CurlMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useCurlMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const curlMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class VorticityMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uCurl: { value: THREE.Texture };\n curl: { value: number };\n dt: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useVorticityMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const vorticityMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n uCurl: { value: null },\n curl: { value: 0 },\n dt: { value: DELTA_TIME },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class ClearMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n value: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useClearMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n value: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class GradientSubtractMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useGradientSubtractMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const gradientSubtractMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: DEFAULT_TEXTURE },\n uVelocity: { value: DEFAULT_TEXTURE },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\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 = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const splatMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 density_dissipation?: number;\n /** velocity dissipation , default : `0.99` */\n velocity_dissipation?: number;\n /** velocity acceleration , default : `10.0` */\n velocity_acceleration?: number;\n /** pressure dissipation , default : `0.9` */\n pressure_dissipation?: number;\n /** pressure iterations. affects performance , default : `20` */\n pressure_iterations?: number;\n /** curl_strength , default : `35` */\n curl_strength?: number;\n /** splat radius , default : `0.002` */\n splat_radius?: number;\n /** Fluid Color.THREE.Vector3 Alternatively, it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default : `THREE.Vector3(1.0, 1.0, 1.0)` */\n fluid_color?:\n | ((velocity: THREE.Vector2) => THREE.Vector3)\n | THREE.Vector3\n | THREE.Color;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type FluidObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n materials: FluidMaterials;\n camera: THREE.Camera;\n renderTarget: {\n velocity: DoubleRenderTarget;\n density: DoubleRenderTarget;\n curl: THREE.WebGLRenderTarget;\n divergence: THREE.WebGLRenderTarget;\n pressure: DoubleRenderTarget;\n };\n output: THREE.Texture;\n};\n\nexport const FLUID_PARAMS: FluidParams = Object.freeze({\n density_dissipation: 0.98,\n velocity_dissipation: 0.99,\n velocity_acceleration: 10.0,\n pressure_dissipation: 0.9,\n pressure_iterations: 20,\n curl_strength: 35,\n splat_radius: 0.002,\n fluid_color: new THREE.Vector3(1.0, 1.0, 1.0),\n pointerValues: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFluid = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n customFluidProps,\n}: {\n /** you can add `onBeforeComile` of the next material.`initial`,`curl`,`vorticity`,`advection`,`divergence`,`pressure`,`clear`,`gradientSubtract`,`splat` \n\t * ```ts\n\t * fluidOnBeforeCompile: {\n vorticity: {\n onBeforeCompile: (shader) => console.log(shader),\n\t\t\t\tuniforms:{\n\t\t\t\t\thoge: { value: 0.0 },\n\t\t\t\t}\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 }),\n [scene, camera, size, samples, _dpr.fbo, isSizeUpdate]\n );\n const [velocityFBO, updateVelocityFBO] = useDoubleFBO(fboProps);\n const [densityFBO, updateDensityFBO] = useDoubleFBO(fboProps);\n const [curlFBO, updateCurlFBO] = useSingleFBO(fboProps);\n const [divergenceFBO, updateDivergenceFBO] = useSingleFBO(fboProps);\n const [pressureFBO, updatePressureFBO] = useDoubleFBO(fboProps);\n\n const 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.velocity_dissipation!\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.density_dissipation!\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.velocity_acceleration!)\n );\n updateParamsList.splat(\n \"color\",\n spaltVec.current.set(scaledDiff.x, scaledDiff.y, 1.0)\n );\n updateParamsList.splat(\"radius\", params.splat_radius!);\n });\n updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n updateParamsList.splat(\"uTarget\", read);\n const color: THREE.Vector3 | THREE.Color =\n typeof params.fluid_color === \"function\"\n ? params.fluid_color(pointerValues.velocity)\n : params.fluid_color!;\n 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.curl_strength!);\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.pressure_dissipation!);\n });\n\n setMeshMaterial(materials.pressureMaterial);\n updateParamsList.pressure(\"uDivergence\", divergenceTex);\n let pressureTexTemp: THREE.Texture;\n for (let i = 0; i < params.pressure_iterations!; 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","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}","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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\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 uniforms: {\n uOpacity: { value: 0.0 },\n uMap: { value: texture || DEFAULT_TEXTURE },\n ...uniforms,\n },\n blending: THREE.AdditiveBlending,\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent.\n transparent: true,\n });\n return mat;\n }, [texture, uniforms]);\n\n const meshArr = useMemo(() => {\n const temp = [];\n for (let i = 0; i < max; i++) {\n const clonedMat = material.clone();\n\n clonedMat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\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 }, [onBeforeCompile, 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 fadeout_speed?: number;\n /** scale rate, default : `0.3` */\n scale?: number;\n /** alpha, default : `0.6` */\n alpha?: number;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type RippleObject = {\n scene: THREE.Scene;\n meshArr: THREE.Mesh[];\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const RIPPLE_PARAMS: RippleParams = Object.freeze({\n frequency: 0.01,\n rotation: 0.05,\n fadeout_speed: 0.9,\n scale: 0.3,\n alpha: 0.6,\n pointerValues: false,\n});\n\ninterface UseRippleProps extends HooksProps {\n /** texture applied to ripple */\n texture?: THREE.Texture;\n /** ripple size, default:64 */\n scale?: number;\n /** ripple max length, default:100 */\n max?: number;\n}\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useRipple = ({\n texture,\n scale = 64,\n max = 100,\n size,\n dpr,\n samples,\n isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: UseRippleProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const 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.fadeout_speed! * mesh.scale.x + params.scale!;\n mesh.scale.y = mesh.scale.x;\n const opacity = material.uniforms.uOpacity.value;\n setUniform(material)(\n \"uOpacity\",\n opacity * params.fadeout_speed!\n );\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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTime: { value: 0.0 },\n scale: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: 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: { value: COLORSTRATA_PARAMS.laminateInterval },\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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateValue = setUniform(material);\n 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 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(MARBLE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(COSPALETTE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uColor0: { value: DUOTONE_PARAMS.color0 },\n uColor1: { value: DUOTONE_PARAMS.color1 },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { FXTEXTURE_PARAMS } from \".\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture0: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_brightness: { value: BRIGHTNESSPICKER_PARAMS.brightness },\n u_min: { value: BRIGHTNESSPICKER_PARAMS.min },\n u_max: { value: BRIGHTNESSPICKER_PARAMS.max },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n uMapIntensity: { value: FXBLENDING_PARAMS.mapIntensity },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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 uniforms,\n onBeforeCompile,\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 });\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\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\nvoid main() {\n\tvec4 tex = texture2D(u_texture, vUv);\n\tvec3 hsv = rgb2hsv(tex.rgb);\n\thsv.y *= u_saturation;\n\thsv.z *= u_brightness;\n\tvec3 final = hsv2rgb(hsv);\n\tgl_FragColor = vec4(final, tex.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { HSV_PARAMS } from \".\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_brightness: { value: HSV_PARAMS.brightness },\n u_saturation: { value: HSV_PARAMS.saturation },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n uniforms,\n onBeforeCompile,\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 });\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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture: { value: DEFAULT_TEXTURE },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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 uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] =\n useParams(COVERTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uBlurSize: { value: SIMPLEBLUR_PARAMS.blurSize },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n const 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 const iterations = params.blurPower!;\n for (let i = 0; i < iterations; i++) {\n updateValue(\"uTexture\", _tempTexture);\n _tempTexture = updateTempTexture(gl);\n }\n\n return _tempTexture;\n },\n [updateTempTexture, updateValue, 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(MOTIONBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uEpicenter: { value: WAVE_PARAMS.epicenter },\n uProgress: { value: WAVE_PARAMS.progress },\n uStrength: { value: WAVE_PARAMS.strength },\n uWidth: { value: WAVE_PARAMS.width },\n uMode: { value: 0 },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(CHROMAKEY_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene; size: Size; dpr: number | false } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uBackbuffer: { value: DEFAULT_TEXTURE },\n uTime: { value: 0 },\n uPointer: { value: new THREE.Vector2() },\n uResolution: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) as BlankMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { BlankMaterial, 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(BLANK_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n size: Size;\n dpr: number | false;\n geometry: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\n mapArray?: THREE.Texture[];\n} & MaterialProps) => {\n const modifiedPositions = useMemo(\n () => modifyAttributes(positions, geometry, \"position\", 3),\n [positions, geometry]\n );\n\n const modifiedUvs = useMemo(\n () => modifyAttributes(uvs, geometry, \"uv\", 2),\n [uvs, geometry]\n );\n\n const material = useMemo(() => {\n if (modifiedPositions.length !== modifiedUvs.length) {\n ISDEV &&\n console.log(\"use-shader-fx:positions and uvs are not matched\");\n }\n\n // vertex\n const rewritedVertexShader = rewriteVertexShader(\n modifiedUvs,\n geometry,\n \"uv\",\n rewriteVertexShader(\n modifiedPositions,\n geometry,\n \"position\",\n vertexShader,\n 3\n ),\n 2\n );\n\n // fragment\n const { rewritedFragmentShader, mapArrayUniforms } =\n rewriteFragmentShader(mapArray, fragmentShader);\n\n const mat = new THREE.ShaderMaterial({\n vertexShader: rewritedVertexShader,\n fragmentShader: rewritedFragmentShader,\n blending: THREE.AdditiveBlending,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent\n transparent: true,\n uniforms: {\n uResolution: { value: new THREE.Vector2(0, 0) },\n uMorphProgress: { value: MORPHPARTICLES_PARAMS.morphProgress },\n uBlurAlpha: { value: MORPHPARTICLES_PARAMS.blurAlpha },\n uBlurRadius: { value: MORPHPARTICLES_PARAMS.blurRadius },\n uPointSize: { value: MORPHPARTICLES_PARAMS.pointSize },\n uPointAlpha: { value: MORPHPARTICLES_PARAMS.pointAlpha },\n uPicture: { value: 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: { value: MORPHPARTICLES_PARAMS.wobbleStrength },\n uWarpPositionFrequency: {\n value: MORPHPARTICLES_PARAMS.warpPositionFrequency,\n },\n uWarpTimeFrequency: {\n value: MORPHPARTICLES_PARAMS.warpTimeFrequency,\n },\n uWarpStrength: { value: MORPHPARTICLES_PARAMS.warpStrength },\n uDisplacement: { value: 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: { value: MORPHPARTICLES_PARAMS.sizeRandomMin },\n uSizeRandomMax: { value: MORPHPARTICLES_PARAMS.sizeRandomMax },\n uDivergence: { value: MORPHPARTICLES_PARAMS.divergence },\n uDivergencePoint: { value: MORPHPARTICLES_PARAMS.divergencePoint },\n ...mapArrayUniforms,\n ...uniforms,\n },\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [\n geometry,\n modifiedPositions,\n modifiedUvs,\n mapArray,\n onBeforeCompile,\n uniforms,\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 uniforms,\n onBeforeCompile,\n}: Create3DHooksProps &\n UseCreateMorphParticlesProps): UseCreateMorphParticlesReturn => {\n const _dpr = getDpr(dpr);\n\n const morphGeometry = useMemo(() => {\n const geo = geometry || new THREE.SphereGeometry(1, 32, 32);\n geo.setIndex(null);\n // Since it is a particle, normal is not necessary\n geo.deleteAttribute(\"normal\");\n return geo;\n }, [geometry]);\n\n const { material, modifiedPositions, modifiedUvs } = useMaterial({\n size,\n dpr: _dpr.shader,\n geometry: morphGeometry,\n positions,\n uvs,\n mapArray,\n uniforms,\n onBeforeCompile,\n });\n\n const { points, interactiveMesh } = useCreateObject({\n scene,\n geometry: morphGeometry,\n material,\n });\n\n const updateValue = setUniform(material);\n const 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 camera,\n geometry,\n positions,\n uvs,\n uniforms,\n onBeforeCompile,\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 uniforms,\n onBeforeCompile,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n });\n\n const updateFx = useCallback(\n (\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 { BufferGeometry, BufferAttribute, InterleavedBuffer, InterleavedBufferAttribute, TrianglesDrawMode, TriangleFanDrawMode, TriangleStripDrawMode, Vector3, Float32BufferAttribute } from \"three\";\nimport { getWithKey } from \"../types/helpers.js\";\nconst mergeBufferGeometries = (geometries, useGroups) => {\n const isIndexed = geometries[0].index !== null;\n const attributesUsed = new Set(Object.keys(geometries[0].attributes));\n const morphAttributesUsed = new Set(Object.keys(geometries[0].morphAttributes));\n const attributes = {};\n const morphAttributes = {};\n const morphTargetsRelative = geometries[0].morphTargetsRelative;\n const mergedGeometry = new BufferGeometry();\n let offset = 0;\n geometries.forEach((geom, i) => {\n let attributesCount = 0;\n if (isIndexed !== (geom.index !== null)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.\"\n );\n return null;\n }\n for (let name in geom.attributes) {\n if (!attributesUsed.has(name)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.'\n );\n return null;\n }\n if (attributes[name] === void 0) {\n attributes[name] = [];\n }\n attributes[name].push(geom.attributes[name]);\n attributesCount++;\n }\n if (attributesCount !== attributesUsed.size) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". Make sure all geometries have the same number of attributes.\"\n );\n return null;\n }\n if (morphTargetsRelative !== geom.morphTargetsRelative) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". .morphTargetsRelative must be consistent throughout all geometries.\"\n );\n return null;\n }\n for (let name in geom.morphAttributes) {\n if (!morphAttributesUsed.has(name)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". .morphAttributes must be consistent throughout all geometries.\"\n );\n return null;\n }\n if (morphAttributes[name] === void 0)\n morphAttributes[name] = [];\n morphAttributes[name].push(geom.morphAttributes[name]);\n }\n mergedGeometry.userData.mergedUserData = mergedGeometry.userData.mergedUserData || [];\n mergedGeometry.userData.mergedUserData.push(geom.userData);\n if (useGroups) {\n let count;\n if (geom.index) {\n count = geom.index.count;\n } else if (geom.attributes.position !== void 0) {\n count = geom.attributes.position.count;\n } else {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". The geometry must have either an index or a position attribute\"\n );\n return null;\n }\n mergedGeometry.addGroup(offset, count, i);\n offset += count;\n }\n });\n if (isIndexed) {\n let indexOffset = 0;\n const mergedIndex = [];\n geometries.forEach((geom) => {\n const index = geom.index;\n for (let j = 0; j < index.count; ++j) {\n mergedIndex.push(index.getX(j) + indexOffset);\n }\n indexOffset += geom.attributes.position.count;\n });\n mergedGeometry.setIndex(mergedIndex);\n }\n for (let name in attributes) {\n const mergedAttribute = mergeBufferAttributes(attributes[name]);\n if (!mergedAttribute) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the \" + name + \" attribute.\"\n );\n return null;\n }\n mergedGeometry.setAttribute(name, mergedAttribute);\n }\n for (let name in morphAttributes) {\n const numMorphTargets = morphAttributes[name][0].length;\n if (numMorphTargets === 0)\n break;\n mergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n mergedGeometry.morphAttributes[name] = [];\n for (let i = 0; i < numMorphTargets; ++i) {\n const morphAttributesToMerge = [];\n for (let j = 0; j < morphAttributes[name].length; ++j) {\n morphAttributesToMerge.push(morphAttributes[name][j][i]);\n }\n const mergedMorphAttribute = mergeBufferAttributes(morphAttributesToMerge);\n if (!mergedMorphAttribute) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the \" + name + \" morphAttribute.\"\n );\n return null;\n }\n mergedGeometry.morphAttributes[name].push(mergedMorphAttribute);\n }\n }\n return mergedGeometry;\n};\nconst mergeBufferAttributes = (attributes) => {\n let TypedArray = void 0;\n let itemSize = void 0;\n let normalized = void 0;\n let arrayLength = 0;\n attributes.forEach((attr) => {\n if (TypedArray === void 0) {\n TypedArray = attr.array.constructor;\n }\n if (TypedArray !== attr.array.constructor) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.\"\n );\n return null;\n }\n if (itemSize === void 0)\n itemSize = attr.itemSize;\n if (itemSize !== attr.itemSize) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.\"\n );\n return null;\n }\n if (normalized === void 0)\n normalized = attr.normalized;\n if (normalized !== attr.normalized) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.\"\n );\n return null;\n }\n arrayLength += attr.array.length;\n });\n if (TypedArray && itemSize) {\n const array = new TypedArray(arrayLength);\n let offset = 0;\n attributes.forEach((attr) => {\n array.set(attr.array, offset);\n offset += attr.array.length;\n });\n return new BufferAttribute(array, itemSize, normalized);\n }\n};\nconst interleaveAttributes = (attributes) => {\n let TypedArray = void 0;\n let arrayLength = 0;\n let stride = 0;\n for (let i = 0, l = attributes.length; i < l; ++i) {\n const attribute = attributes[i];\n if (TypedArray === void 0)\n TypedArray = attribute.array.constructor;\n if (TypedArray !== attribute.array.constructor) {\n console.error(\"AttributeBuffers of different types cannot be interleaved\");\n return null;\n }\n arrayLength += attribute.array.length;\n stride += attribute.itemSize;\n }\n const interleavedBuffer = new InterleavedBuffer(new TypedArray(arrayLength), stride);\n let offset = 0;\n const res = [];\n const getters = [\"getX\", \"getY\", \"getZ\", \"getW\"];\n const setters = [\"setX\", \"setY\", \"setZ\", \"setW\"];\n for (let j = 0, l = attributes.length; j < l; j++) {\n const attribute = attributes[j];\n const itemSize = attribute.itemSize;\n const count = attribute.count;\n const iba = new InterleavedBufferAttribute(interleavedBuffer, itemSize, offset, attribute.normalized);\n res.push(iba);\n offset += itemSize;\n for (let c = 0; c < count; c++) {\n for (let k = 0; k < itemSize; k++) {\n const set = getWithKey(iba, setters[k]);\n const get = getWithKey(attribute, getters[k]);\n set(c, get(c));\n }\n }\n }\n return res;\n};\nfunction estimateBytesUsed(geometry) {\n let mem = 0;\n for (let name in geometry.attributes) {\n const attr = geometry.getAttribute(name);\n mem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n }\n const indices = geometry.getIndex();\n mem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n return mem;\n}\nfunction mergeVertices(geometry, tolerance = 1e-4) {\n tolerance = Math.max(tolerance, Number.EPSILON);\n const hashToIndex = {};\n const indices = geometry.getIndex();\n const positions = geometry.getAttribute(\"position\");\n const vertexCount = indices ? indices.count : positions.count;\n let nextIndex = 0;\n const attributeNames = Object.keys(geometry.attributes);\n const attrArrays = {};\n const morphAttrsArrays = {};\n const newIndices = [];\n const getters = [\"getX\", \"getY\", \"getZ\", \"getW\"];\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n const name = attributeNames[i];\n attrArrays[name] = [];\n const morphAttr = geometry.morphAttributes[name];\n if (morphAttr) {\n morphAttrsArrays[name] = new Array(morphAttr.length).fill(0).map(() => []);\n }\n }\n const decimalShift = Math.log10(1 / tolerance);\n const shiftMultiplier = Math.pow(10, decimalShift);\n for (let i = 0; i < vertexCount; i++) {\n const index = indices ? indices.getX(i) : i;\n let hash = \"\";\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const itemSize = attribute.itemSize;\n for (let k = 0; k < itemSize; k++) {\n hash += `${~~(attribute[getters[k]](index) * shiftMultiplier)},`;\n }\n }\n if (hash in hashToIndex) {\n newIndices.push(hashToIndex[hash]);\n } else {\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const morphAttr = geometry.morphAttributes[name];\n const itemSize = attribute.itemSize;\n const newarray = attrArrays[name];\n const newMorphArrays = morphAttrsArrays[name];\n for (let k = 0; k < itemSize; k++) {\n const getterFunc = getters[k];\n newarray.push(attribute[getterFunc](index));\n if (morphAttr) {\n for (let m = 0, ml = morphAttr.length; m < ml; m++) {\n newMorphArrays[m].push(morphAttr[m][getterFunc](index));\n }\n }\n }\n }\n hashToIndex[hash] = nextIndex;\n newIndices.push(nextIndex);\n nextIndex++;\n }\n }\n const result = geometry.clone();\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n const name = attributeNames[i];\n const oldAttribute = geometry.getAttribute(name);\n const buffer = new oldAttribute.array.constructor(attrArrays[name]);\n const attribute = new BufferAttribute(buffer, oldAttribute.itemSize, oldAttribute.normalized);\n result.setAttribute(name, attribute);\n if (name in morphAttrsArrays) {\n for (let j = 0; j < morphAttrsArrays[name].length; j++) {\n const oldMorphAttribute = geometry.morphAttributes[name][j];\n const buffer2 = new oldMorphAttribute.array.constructor(morphAttrsArrays[name][j]);\n const morphAttribute = new BufferAttribute(buffer2, oldMorphAttribute.itemSize, oldMorphAttribute.normalized);\n result.morphAttributes[name][j] = morphAttribute;\n }\n }\n }\n result.setIndex(newIndices);\n return result;\n}\nfunction toTrianglesDrawMode(geometry, drawMode) {\n if (drawMode === TrianglesDrawMode) {\n console.warn(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.\");\n return geometry;\n }\n if (drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode) {\n let index = geometry.getIndex();\n if (index === null) {\n const indices = [];\n const position = geometry.getAttribute(\"position\");\n if (position !== void 0) {\n for (let i = 0; i < position.count; i++) {\n indices.push(i);\n }\n geometry.setIndex(indices);\n index = geometry.getIndex();\n } else {\n console.error(\n \"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.\"\n );\n return geometry;\n }\n }\n const numberOfTriangles = index.count - 2;\n const newIndices = [];\n if (index) {\n if (drawMode === TriangleFanDrawMode) {\n for (let i = 1; i <= numberOfTriangles; i++) {\n newIndices.push(index.getX(0));\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n }\n } else {\n for (let i = 0; i < numberOfTriangles; i++) {\n if (i % 2 === 0) {\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i + 2));\n } else {\n newIndices.push(index.getX(i + 2));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i));\n }\n }\n }\n }\n if (newIndices.length / 3 !== numberOfTriangles) {\n console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.\");\n }\n const newGeometry = geometry.clone();\n newGeometry.setIndex(newIndices);\n newGeometry.clearGroups();\n return newGeometry;\n } else {\n console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:\", drawMode);\n return geometry;\n }\n}\nfunction computeMorphedAttributes(object) {\n if (object.geometry.isBufferGeometry !== true) {\n console.error(\"THREE.BufferGeometryUtils: Geometry is not of type BufferGeometry.\");\n return null;\n }\n const _vA = new Vector3();\n const _vB = new Vector3();\n const _vC = new Vector3();\n const _tempA = new Vector3();\n const _tempB = new Vector3();\n const _tempC = new Vector3();\n const _morphA = new Vector3();\n const _morphB = new Vector3();\n const _morphC = new Vector3();\n function _calculateMorphedAttributeData(object2, material2, attribute, morphAttribute, morphTargetsRelative2, a2, b2, c2, modifiedAttributeArray) {\n _vA.fromBufferAttribute(attribute, a2);\n _vB.fromBufferAttribute(attribute, b2);\n _vC.fromBufferAttribute(attribute, c2);\n const morphInfluences = object2.morphTargetInfluences;\n if (\n // @ts-ignore\n material2.morphTargets && morphAttribute && morphInfluences\n ) {\n _morphA.set(0, 0, 0);\n _morphB.set(0, 0, 0);\n _morphC.set(0, 0, 0);\n for (let i2 = 0, il2 = morphAttribute.length; i2 < il2; i2++) {\n const influence = morphInfluences[i2];\n const morph = morphAttribute[i2];\n if (influence === 0)\n continue;\n _tempA.fromBufferAttribute(morph, a2);\n _tempB.fromBufferAttribute(morph, b2);\n _tempC.fromBufferAttribute(morph, c2);\n if (morphTargetsRelative2) {\n _morphA.addScaledVector(_tempA, influence);\n _morphB.addScaledVector(_tempB, influence);\n _morphC.addScaledVector(_tempC, influence);\n } else {\n _morphA.addScaledVector(_tempA.sub(_vA), influence);\n _morphB.addScaledVector(_tempB.sub(_vB), influence);\n _morphC.addScaledVector(_tempC.sub(_vC), influence);\n }\n }\n _vA.add(_morphA);\n _vB.add(_morphB);\n _vC.add(_morphC);\n }\n if (object2.isSkinnedMesh) {\n object2.boneTransform(a2, _vA);\n object2.boneTransform(b2, _vB);\n object2.boneTransform(c2, _vC);\n }\n modifiedAttributeArray[a2 * 3 + 0] = _vA.x;\n modifiedAttributeArray[a2 * 3 + 1] = _vA.y;\n modifiedAttributeArray[a2 * 3 + 2] = _vA.z;\n modifiedAttributeArray[b2 * 3 + 0] = _vB.x;\n modifiedAttributeArray[b2 * 3 + 1] = _vB.y;\n modifiedAttributeArray[b2 * 3 + 2] = _vB.z;\n modifiedAttributeArray[c2 * 3 + 0] = _vC.x;\n modifiedAttributeArray[c2 * 3 + 1] = _vC.y;\n modifiedAttributeArray[c2 * 3 + 2] = _vC.z;\n }\n const geometry = object.geometry;\n const material = object.material;\n let a, b, c;\n const index = geometry.index;\n const positionAttribute = geometry.attributes.position;\n const morphPosition = geometry.morphAttributes.position;\n const morphTargetsRelative = geometry.morphTargetsRelative;\n const normalAttribute = geometry.attributes.normal;\n const morphNormal = geometry.morphAttributes.position;\n const groups = geometry.groups;\n const drawRange = geometry.drawRange;\n let i, j, il, jl;\n let group, groupMaterial;\n let start, end;\n const modifiedPosition = new Float32Array(positionAttribute.count * positionAttribute.itemSize);\n const modifiedNormal = new Float32Array(normalAttribute.count * normalAttribute.itemSize);\n if (index !== null) {\n if (Array.isArray(material)) {\n for (i = 0, il = groups.length; i < il; i++) {\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n start = Math.max(group.start, drawRange.start);\n end = Math.min(group.start + group.count, drawRange.start + drawRange.count);\n for (j = start, jl = end; j < jl; j += 3) {\n a = index.getX(j);\n b = index.getX(j + 1);\n c = index.getX(j + 2);\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else {\n start = Math.max(0, drawRange.start);\n end = Math.min(index.count, drawRange.start + drawRange.count);\n for (i = start, il = end; i < il; i += 3) {\n a = index.getX(i);\n b = index.getX(i + 1);\n c = index.getX(i + 2);\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else if (positionAttribute !== void 0) {\n if (Array.isArray(material)) {\n for (i = 0, il = groups.length; i < il; i++) {\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n start = Math.max(group.start, drawRange.start);\n end = Math.min(group.start + group.count, drawRange.start + drawRange.count);\n for (j = start, jl = end; j < jl; j += 3) {\n a = j;\n b = j + 1;\n c = j + 2;\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else {\n start = Math.max(0, drawRange.start);\n end = Math.min(positionAttribute.count, drawRange.start + drawRange.count);\n for (i = start, il = end; i < il; i += 3) {\n a = i;\n b = i + 1;\n c = i + 2;\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n }\n const morphedPositionAttribute = new Float32BufferAttribute(modifiedPosition, 3);\n const morphedNormalAttribute = new Float32BufferAttribute(modifiedNormal, 3);\n return {\n positionAttribute,\n normalAttribute,\n morphedPositionAttribute,\n morphedNormalAttribute\n };\n}\nfunction toCreasedNormals(geometry, creaseAngle = Math.PI / 3) {\n const creaseDot = Math.cos(creaseAngle);\n const hashMultiplier = (1 + 1e-10) * 100;\n const verts = [new Vector3(), new Vector3(), new Vector3()];\n const tempVec1 = new Vector3();\n const tempVec2 = new Vector3();\n const tempNorm = new Vector3();\n const tempNorm2 = new Vector3();\n function hashVertex(v) {\n const x = ~~(v.x * hashMultiplier);\n const y = ~~(v.y * hashMultiplier);\n const z = ~~(v.z * hashMultiplier);\n return `${x},${y},${z}`;\n }\n const resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;\n const posAttr = resultGeometry.attributes.position;\n const vertexMap = {};\n for (let i = 0, l = posAttr.count / 3; i < l; i++) {\n const i3 = 3 * i;\n const a = verts[0].fromBufferAttribute(posAttr, i3 + 0);\n const b = verts[1].fromBufferAttribute(posAttr, i3 + 1);\n const c = verts[2].fromBufferAttribute(posAttr, i3 + 2);\n tempVec1.subVectors(c, b);\n tempVec2.subVectors(a, b);\n const normal = new Vector3().crossVectors(tempVec1, tempVec2).normalize();\n for (let n = 0; n < 3; n++) {\n const vert = verts[n];\n const hash = hashVertex(vert);\n if (!(hash in vertexMap)) {\n vertexMap[hash] = [];\n }\n vertexMap[hash].push(normal);\n }\n }\n const normalArray = new Float32Array(posAttr.count * 3);\n const normAttr = new BufferAttribute(normalArray, 3, false);\n for (let i = 0, l = posAttr.count / 3; i < l; i++) {\n const i3 = 3 * i;\n const a = verts[0].fromBufferAttribute(posAttr, i3 + 0);\n const b = verts[1].fromBufferAttribute(posAttr, i3 + 1);\n const c = verts[2].fromBufferAttribute(posAttr, i3 + 2);\n tempVec1.subVectors(c, b);\n tempVec2.subVectors(a, b);\n tempNorm.crossVectors(tempVec1, tempVec2).normalize();\n for (let n = 0; n < 3; n++) {\n const vert = verts[n];\n const hash = hashVertex(vert);\n const otherNormals = vertexMap[hash];\n tempNorm2.set(0, 0, 0);\n for (let k = 0, lk = otherNormals.length; k < lk; k++) {\n const otherNorm = otherNormals[k];\n if (tempNorm.dot(otherNorm) > creaseDot) {\n tempNorm2.add(otherNorm);\n }\n }\n tempNorm2.normalize();\n normAttr.setXYZ(i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z);\n }\n }\n resultGeometry.setAttribute(\"normal\", normAttr);\n return resultGeometry;\n}\nexport {\n computeMorphedAttributes,\n estimateBytesUsed,\n interleaveAttributes,\n mergeBufferAttributes,\n mergeBufferGeometries,\n mergeVertices,\n toCreasedNormals,\n toTrianglesDrawMode\n};\n//# sourceMappingURL=BufferGeometryUtils.js.map\n","#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 { useMemo } from \"react\";\nimport transmission_pars_fragment from \"./shaders/transmission_pars_fragment.glsl\";\nimport transmission_fragment from \"./shaders/transmission_fragment.glsl\";\nimport { WOBBLE3D_PARAMS } from \".\";\nimport { MaterialProps } from \"../../types\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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\n/** You also need to rewrite the vertext shader of depthMaterial */\nconst rewriteVertex = (vertex: string) => {\n let shader = vertex;\n shader = shader.replace(\n \"#include \",\n `\n\t\tvec3 objectNormal = usf_Normal;\n\t\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t\t#endif`\n );\n // position\n shader = shader.replace(\n \"#include \",\n `\n\t\tvec3 transformed = usf_Position;`\n );\n\n // uniforms\n shader = shader.replace(\n \"void main() {\",\n `\n\t\tuniform float uTime;\n\t\tuniform float uWobblePositionFrequency;\n\t\tuniform float uWobbleTimeFrequency;\n\t\tuniform float uWobbleStrength;\n\t\tuniform float uWarpPositionFrequency;\n\t\tuniform float uWarpTimeFrequency;\n\t\tuniform float uWarpStrength;\n\t\tattribute vec4 tangent;\n\t\tvarying float vWobble;\n\t\tvarying vec2 vPosition;\n\t\t// edge\n\t\tvarying vec3 vEdgeNormal;\n\t\tvarying vec3 vEdgeViewPosition;\n\t\t#usf \n\t\tvoid main() {\n\t\t`\n );\n\n // vert\n shader = shader.replace(\n \"void main() {\",\n `\n\t\tvoid main() {\n\t\tvec3 usf_Position = position;\n\t\tvec3 usf_Normal = normal;\n\t\tvec3 biTangent = cross(normal, tangent.xyz);\n\t\t\n\t\t// Neighbours positions\n\t\tfloat shift = 0.01;\n\t\tvec3 positionA = usf_Position + tangent.xyz * shift;\n\t\tvec3 positionB = usf_Position + biTangent * shift;\n\t\t\n\t\t// wobble\n\t\tfloat wobble = (uWobbleStrength > 0.) ? getWobble(usf_Position) : 0.0;\n\t\tfloat wobblePositionA = (uWobbleStrength > 0.) ? getWobble(positionA) : 0.0;\n\t\tfloat wobblePositionB = (uWobbleStrength > 0.) ? getWobble(positionB) : 0.0;\n\t\t\n\t\tusf_Position += wobble * normal;\n\t\tpositionA += wobblePositionA * normal;\n\t\tpositionB += wobblePositionB * normal;\n\n\t\t// Compute normal\n\t\tvec3 toA = normalize(positionA - usf_Position);\n\t\tvec3 toB = normalize(positionB - usf_Position);\n\t\tusf_Normal = cross(toA, toB);\n\t\t\n\t\t// Varying\n\t\tvPosition = usf_Position.xy;\n\t\tvWobble = wobble/uWobbleStrength;\n\t\t\n\t\tvEdgeNormal = normalize(normalMatrix * usf_Normal);\n\t\tvec4 viewPosition = viewMatrix * modelMatrix * vec4(usf_Position, 1.0);\n\t\tvEdgeViewPosition = normalize(viewPosition.xyz);\n\t\t`\n );\n return shader;\n};\n\nexport type WobbleMaterialConstructor = new (opts: {\n [key: string]: any;\n}) => THREE.Material;\ntype WobbleMaterialParams =\n ConstructorParameters[0];\nexport interface WobbleMaterialProps\n extends MaterialProps {\n /** default:THREE.MeshPhysicalMaterial */\n baseMaterial?: T;\n materialParameters?: WobbleMaterialParams;\n /**\n * An optional callback that is executed immediately before the depth shader program is compiled.\n * @param shader — Source code of the shader\n * @param renderer — WebGLRenderer Context that is initializing the material\n */\n depthOnBeforeCompile?: (\n shader: THREE.WebGLProgramParametersWithUniforms,\n renderer: THREE.WebGLRenderer\n ) => 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 onBeforeCompile,\n depthOnBeforeCompile,\n isCustomTransmission = false,\n uniforms,\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 ...uniforms,\n },\n });\n\n mat.onBeforeCompile = (shader, renderer) => {\n Object.assign(shader.uniforms, mat.userData.uniforms);\n\n /********************\n\t\t\tvert\n\t\t\t********************/\n shader.vertexShader = rewriteVertex(shader.vertexShader);\n\n /********************\n\t\t\tfrag\n\t\t\t********************/\n // diffuse color , Manipulate color mixing ratio with `uColorMix`\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `\n\t\t\t\t\t#include \n\n\t\t\t\t\tif (uEdgeThreshold > 0.0) {\n\t\t\t\t\t\tfloat edgeThreshold = dot(vEdgeNormal, -vEdgeViewPosition);\n\t\t\t\t\t\tdiffuseColor = edgeThreshold < uEdgeThreshold ? vec4(uEdgeColor, 1.0) : mix(diffuseColor, usf_DiffuseColor, uColorMix);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdiffuseColor = mix(diffuseColor, usf_DiffuseColor, uColorMix);\n\t\t\t\t\t}\n\t\t\t\t`\n );\n\n // frag\n shader.fragmentShader = shader.fragmentShader.replace(\n \"void main() {\",\n `\n\t\t\t\tuniform vec3 uColor0;\n\t\t\t\tuniform vec3 uColor1;\n\t\t\t\tuniform vec3 uColor2;\n\t\t\t\tuniform vec3 uColor3;\n\t\t\t\tuniform float uColorMix;\n\t\t\t\tuniform float uEdgeThreshold;\n\t\t\t\tuniform vec3 uEdgeColor;\n\t\t\t\t\n\t\t\t\t// transmission\n\t\t\t\tuniform float uChromaticAberration; \n\t\t\t\tuniform float uAnisotropicBlur; \n\t\t\t\tuniform float uTime;\n\t\t\t\tuniform float uDistortion;\n\t\t\t\tuniform float uDistortionScale;\n\t\t\t\tuniform float uTemporalDistortion;\n\t\t\t\tuniform float uRefractionSamples;\n\t\t\t\t\n\t\t\t\tfloat rand(float n){return fract(sin(n) * 43758.5453123);}\n\t\t\t\t#usf \n\n\t\t\t\tvarying float vWobble;\n\t\t\t\tvarying vec2 vPosition;\n\t\t\t\tvarying vec3 vEdgeNormal;\n\t\t\t\tvarying vec3 vEdgeViewPosition;\n\t\t\t\t\n\t\t\t\tvoid main(){\n\t\t\t\t\tvec4 usf_DiffuseColor = vec4(1.0);\n\t\t\t\t\tfloat colorWobbleMix = smoothstep(-1.,1.,vWobble);\n\t\t\t\t\tvec2 colorPosMix = vec2(smoothstep(-1.,1.,vPosition.x),smoothstep(-1.,1.,vPosition.y));\n\t\t\t\t\n\t\t\t\t\tusf_DiffuseColor.rgb = mix(mix(uColor0, uColor1, colorPosMix.x), mix(uColor2, uColor3, colorPosMix.y), colorWobbleMix);\n\t\t\t\t`\n );\n\n // custom transmission\n if (mat.type === \"MeshPhysicalMaterial\" && isCustomTransmission) {\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `${transmission_pars_fragment}`\n );\n\n shader.fragmentShader = shader.fragmentShader.replace(\n \"#include \",\n `${transmission_fragment}`\n );\n }\n\n setOnBeforeCompile(onBeforeCompile)(shader, renderer);\n };\n mat.needsUpdate = true;\n\n /*===============================================\n\t\tdepthMaterial\n\t\t===============================================*/\n const depthMat = new THREE.MeshDepthMaterial({\n depthPacking: THREE.RGBADepthPacking,\n });\n depthMat.onBeforeCompile = (shader, renderer) => {\n Object.assign(shader.uniforms, mat.userData.uniforms);\n shader.vertexShader = rewriteVertex(shader.vertexShader);\n setOnBeforeCompile(depthOnBeforeCompile)(shader, renderer);\n };\n depthMat.needsUpdate = true;\n\n return { material: mat, depthMaterial: depthMat };\n }, [\n materialParameters,\n baseMaterial,\n onBeforeCompile,\n depthOnBeforeCompile,\n uniforms,\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 onBeforeCompile,\n depthOnBeforeCompile,\n uniforms,\n}: UseCreateWobble3DProps &\n Create3DHooksProps &\n WobbleMaterialProps): UseCreateWobble3DReturn => {\n const wobbleGeometry = useMemo(() => {\n let geo = geometry || new THREE.IcosahedronGeometry(2, 20);\n geo = mergeVertices(geo);\n geo.computeTangents();\n return geo;\n }, [geometry]);\n const { material, depthMaterial } = useMaterial({\n baseMaterial,\n materialParameters,\n onBeforeCompile,\n depthOnBeforeCompile,\n uniforms,\n isCustomTransmission,\n });\n\n const mesh = useAddObject(scene, wobbleGeometry, material, THREE.Mesh);\n\n const userData = material.userData as Wobble3DMaterial;\n const updateValue = setUniform(userData);\n const 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 isSizeUpdate,\n camera,\n geometry,\n baseMaterial,\n materialParameters,\n uniforms,\n onBeforeCompile,\n depthOnBeforeCompile,\n isCustomTransmission,\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 uniforms,\n onBeforeCompile,\n depthOnBeforeCompile,\n isCustomTransmission,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n });\n\n const updateFx = useCallback(\n (\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","export type EasingTypes =\n | \"easeInSine\"\n | \"easeOutSine\"\n | \"easeInOutSine\"\n | \"easeInQuad\"\n | \"easeOutQuad\"\n | \"easeInOutQuad\"\n | \"easeInCubic\"\n | \"easeOutCubic\"\n | \"easeInOutCubic\"\n | \"easeInQuart\"\n | \"easeOutQuart\"\n | \"easeInOutQuart\"\n | \"easeInQuint\"\n | \"easeOutQuint\"\n | \"easeInOutQuint\"\n | \"easeInExpo\"\n | \"easeOutExpo\"\n | \"easeInOutExpo\"\n | \"easeInCirc\"\n | \"easeOutCirc\"\n | \"easeInOutCirc\"\n | \"easeInBack\"\n | \"easeOutBack\"\n | \"easeInOutBack\"\n | \"easeInElastic\"\n | \"easeOutElastic\"\n | \"easeInOutElastic\"\n | \"easeInBounce\"\n | \"easeOutBounce\"\n | \"easeInOutBounce\";\n\ntype EasingFunctions = {\n [K in EasingTypes]: (x: number) => number;\n};\n\n/**\n * from https://github.com/ai/easings.net\n */\nexport const Easing: EasingFunctions = Object.freeze({\n easeInSine(x: number): number {\n return 1 - Math.cos((x * Math.PI) / 2);\n },\n easeOutSine(x: number): number {\n return Math.sin((x * Math.PI) / 2);\n },\n easeInOutSine(x: number): number {\n return -(Math.cos(Math.PI * x) - 1) / 2;\n },\n easeInQuad(x: number): number {\n return x * x;\n },\n easeOutQuad(x: number): number {\n return 1 - (1 - x) * (1 - x);\n },\n easeInOutQuad(x: number): number {\n return x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2;\n },\n easeInCubic(x: number): number {\n return x * x * x;\n },\n easeOutCubic(x: number): number {\n return 1 - Math.pow(1 - x, 3);\n },\n easeInOutCubic(x: number): number {\n return x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2;\n },\n easeInQuart(x: number): number {\n return x * x * x * x;\n },\n easeOutQuart(x: number): number {\n return 1 - Math.pow(1 - x, 4);\n },\n easeInOutQuart(x: number): number {\n return x < 0.5 ? 8 * x * x * x * x : 1 - Math.pow(-2 * x + 2, 4) / 2;\n },\n easeInQuint(x: number): number {\n return x * x * x * x * x;\n },\n easeOutQuint(x: number): number {\n return 1 - Math.pow(1 - x, 5);\n },\n easeInOutQuint(x: number): number {\n return x < 0.5 ? 16 * x * x * x * x * x : 1 - Math.pow(-2 * x + 2, 5) / 2;\n },\n easeInExpo(x: number): number {\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\n },\n easeOutExpo(x: number): number {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n },\n easeInOutExpo(x: number): number {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? Math.pow(2, 20 * x - 10) / 2\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\n },\n easeInCirc(x: number): number {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n },\n easeOutCirc(x: number): number {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n },\n easeInOutCirc(x: number): number {\n return x < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\n },\n easeInBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return c3 * x * x * x - c1 * x * x;\n },\n easeOutBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return 1 + c3 * Math.pow(x - 1, 3) + c1 * Math.pow(x - 1, 2);\n },\n easeInOutBack(x: number): number {\n const c1 = 1.70158;\n const c2 = c1 * 1.525;\n\n return x < 0.5\n ? (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2\n : (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2;\n },\n easeInElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\n },\n easeOutElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1;\n },\n easeInOutElastic(x: number): number {\n const c5 = (2 * Math.PI) / 4.5;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * c5)) / 2\n : (Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * c5)) / 2 +\n 1;\n },\n easeInBounce(x: number): number {\n return 1 - Easing.easeOutBounce(1 - x);\n },\n easeOutBounce(x: number): number {\n const n1 = 7.5625;\n const d1 = 2.75;\n\n if (x < 1 / d1) {\n return n1 * x * x;\n } else if (x < 2 / d1) {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n } else if (x < 2.5 / d1) {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n } else {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n },\n easeInOutBounce(x: number): number {\n return x < 0.5\n ? (1 - Easing.easeOutBounce(1 - 2 * x)) / 2\n : (1 + Easing.easeOutBounce(2 * x - 1)) / 2;\n },\n});\n","import * as THREE from \"three\";\nimport { Easing, EasingTypes } from \"../libs/easing\";\nimport { useCallback } from \"react\";\n\n/** Returns a unique hash specific to the beat */\nfunction getHash(input: number) {\n let n = Math.sin(input * 12.9898) * 43758.5453;\n return n - Math.floor(n);\n}\n\ntype BeatValues = {\n beat: number;\n floor: number;\n fract: number;\n /** unique hash specific to the beat */\n hash: number;\n};\n\n/**\n * @param ease easing functions are referenced from https://github.com/ai/easings.net , default : \"easeOutQuart\"\n */\nexport const useBeat = (bpm: number, ease: EasingTypes = \"easeOutQuart\") => {\n const rhythm = bpm / 60;\n const easing = Easing[ease];\n const updateBeat = useCallback(\n (clock: THREE.Clock) => {\n let beat = clock.getElapsedTime() * rhythm;\n const floor = Math.floor(beat);\n const fract = easing(beat - floor);\n beat = fract + floor;\n const hash = getHash(floor);\n return {\n beat,\n floor,\n fract,\n hash,\n } as BeatValues;\n },\n [rhythm, easing]\n );\n return updateBeat;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo, useRef } from \"react\";\n\n/**\n * @param fps FPS you want to limit , default : `60`\n *\n * ```tsx\n * const limiter = useFPSLimiter(fps);\n * useFrame((props) => {\n * if (limiter(props.clock)) {\n *\t\t //some code\n * }\n * });\n * ```\n */\nexport const useFPSLimiter = (fps: number = 60) => {\n const interval = useMemo(() => 1 / Math.max(Math.min(fps, 60), 1), [fps]);\n const prevTime = useRef(null);\n\n const limiter = useCallback(\n (clock: THREE.Clock) => {\n const tick = clock.getElapsedTime();\n if (prevTime.current === null) {\n prevTime.current = tick;\n return true;\n }\n const deltaTime = tick - prevTime.current;\n if (deltaTime >= interval) {\n prevTime.current = tick;\n return true;\n }\n return false;\n },\n [interval]\n );\n\n return limiter;\n};\n","import { DomSyncerParams } from \"..\";\n\nexport const errorHandler = (params: DomSyncerParams) => {\n const domLength = params.dom?.length;\n const textureLength = params.texture?.length;\n\n if (!domLength || !textureLength) {\n return true;\n }\n\n if (domLength !== textureLength) {\n return true;\n }\n\n return false;\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec2 u_textureResolution;\nuniform vec2 u_resolution;\nuniform float u_borderRadius;\n\nvoid main() {\n\t// texuture color\n\tfloat screenAspect = u_resolution.x / u_resolution.y;\n\tfloat textureAspect = u_textureResolution.x / u_textureResolution.y;\n\tvec2 ratio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\n\tvec2 adjustedUv = vUv * ratio + (1.0 - ratio) * 0.5;\n\tvec3 textureColor = texture2D(u_texture, adjustedUv).rgb;\n\tfloat textureAlpha = texture2D(u_texture, adjustedUv).a;\n\n\t// Based on https://mofu-dev.com/en/blog/three-dom-alignment/\n\tfloat maxSide = max(u_resolution.x, u_resolution.y);\n\tfloat minSide = min(u_resolution.x, u_resolution.y);\n\tvec2 aspect = u_resolution / maxSide;\n\tvec2 alphaUv = vUv - 0.5;\n\n\tfloat borderRadius = min(u_borderRadius, minSide * 0.5);\n\tvec2 offset = vec2(borderRadius) / u_resolution;\n\tvec2 alphaXY = smoothstep(vec2(0.5 - offset), vec2(0.5 - offset - 0.001), abs(alphaUv));\n\tfloat alpha = min(1.0, alphaXY.x + alphaXY.y);\n\n\tvec2 alphaUv2 = abs(vUv - 0.5);\n\tfloat radius = borderRadius / maxSide;\n\talphaUv2 = (alphaUv2 - 0.5) * aspect + radius;\n\tfloat roundAlpha = smoothstep(radius + 0.001, radius, length(alphaUv2));\n\n\talpha = min(1.0, alpha + roundAlpha);\n\n\t// multiply texture alpha\n\talpha *= textureAlpha;\n\n\tgl_FragColor = vec4(textureColor, alpha);\n}\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"../\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"../shader/main.vert\";\nimport fragmentShader from \"../shader/main.frag\";\nimport { MaterialProps } from \"../../../fxs/types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../libs/constants\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n params: DomSyncerParams;\n size: Size;\n scene: THREE.Scene;\n} & MaterialProps) => {\n if (scene.children.length > 0) {\n scene.children.forEach((child) => {\n if (child instanceof THREE.Mesh) {\n child.geometry.dispose();\n child.material.dispose();\n }\n });\n scene.remove(...scene.children);\n }\n\n params.texture!.forEach((texture, i) => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: texture },\n u_textureResolution: {\n value: new THREE.Vector2(0, 0),\n },\n u_resolution: { value: new THREE.Vector2(0, 0) },\n u_borderRadius: {\n value: params.boderRadius![i] ? params.boderRadius![i] : 0.0,\n },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent.\n transparent: true,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n const mesh = new THREE.Mesh(new THREE.PlaneGeometry(1, 1), mat);\n scene.add(mesh);\n });\n};\n","import { useCallback, useRef } from \"react\";\nimport { DomSyncerParams } from \"..\";\n\nexport const useIntersectionHandler = () => {\n const intersectionObserverRef = useRef([]);\n const intersectionDomRef = useRef<(HTMLElement | Element | null)[]>([]);\n\n const intersectionHandler = useCallback(\n ({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n }: {\n isIntersectingRef: React.MutableRefObject;\n isIntersectingOnceRef: React.MutableRefObject;\n params: DomSyncerParams;\n }) => {\n if (intersectionObserverRef.current.length > 0) {\n intersectionObserverRef.current.forEach((observer, i) => {\n observer.unobserve(intersectionDomRef.current[i]!);\n });\n }\n\n intersectionDomRef.current = [];\n intersectionObserverRef.current = [];\n\n const newArr = new Array(params.dom!.length).fill(false);\n isIntersectingRef.current = [...newArr];\n isIntersectingOnceRef.current = [...newArr];\n\n params.dom!.forEach((dom, i) => {\n const callback = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n params.onIntersect![i] && params.onIntersect![i](entry);\n // Update the judgment after execution so that the judgment of isIntersectin can be used when executing onIntersect\n isIntersectingRef.current[i] = entry.isIntersecting;\n });\n };\n const observer = new IntersectionObserver(callback, {\n rootMargin: \"0px\",\n threshold: 0,\n });\n observer.observe(dom!);\n intersectionObserverRef.current.push(observer);\n intersectionDomRef.current.push(dom!);\n });\n },\n []\n );\n\n return intersectionHandler;\n};\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"..\";\nimport { Size } from \"@react-three/fiber\";\nimport {\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, samples, isSizeUpdate, uniforms, onBeforeCompile }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n const [params, setParams] = useParams({\n ...DOMSYNCER_PARAMS,\n updateKey: performance.now(),\n });\n\n const [DOMRects, updateDomRects] = useUpdateDomRect();\n\n // Avoid instancing vec2 every frame\n const resolutionRef = useRef(new THREE.Vector2(0, 0));\n\n // Update monitored doms according to the dependency array\n const [refreshTrigger, setRefreshTrigger] = useState(true);\n useMemo(\n () => setRefreshTrigger(true),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n dependencies\n );\n\n // If the dependencies have been updated but the key has not been updated, skip processing and return an empty texture\n const updateKey = useRef(null);\n const emptyTexture = useMemo(() => 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 uniforms,\n onBeforeCompile,\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 uniforms,\n intersectionHandler,\n onBeforeCompile,\n refreshTrigger,\n scene,\n params,\n isIntersectingOnceRef,\n isIntersectingRef,\n emptyTexture,\n updateParams,\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 { UseFboProps, renderFBO, FBO_OPTION } from \"../utils/useSingleFBO\";\n\ntype UpdateCopyFunction = (\n gl: THREE.WebGLRenderer,\n index: number,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseCopyTextureReturn = [THREE.WebGLRenderTarget[], UpdateCopyFunction];\n\n/**\n * Generate an FBO array to copy the texture.\n * @param dpr If dpr is set, dpr will be multiplied, default : `false`\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false`\n * @param length The number of FBOs to create\n * @returns [THREE.WebGLRenderTarget[] , updateCopyTexture] - Receives the RenderTarget array as the first argument and the update function as the second argument. `updateCopyTexture()` receives gl as the first argument and the index of the texture you want to copy as the second argument.\n */\nexport const useCopyTexture = (\n {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n }: UseFboProps,\n length: number\n): UseCopyTextureReturn => {\n const renderTargetArr = useRef([]);\n const resolution = useResolution(size, dpr);\n\n renderTargetArr.current = useMemo(() => {\n return Array.from({ length }, () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [length]);\n\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","setUniform","material","key","value","uniforms","setCustomUniform","customParams","useAddObject","scene","geometry","Proto","object3D","obj","useEffect","ISDEV","MATERIAL_BASIC_PARAMS","DEFAULT_TEXTURE","wobble3D_default","snoise_default","coverTexture_default","fxBlending_default","planeVert_default","SHADER_CHUNK","wobble3D","snoise","coverTexture","fxBlending","planeVert","includePattern","includeReplacer","match","include","string","resolveIncludes","resolveShaders","parameters","setOnBeforeCompile","onBeforeCompile","renderer","useMesh","mat","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_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","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","iterations","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","mergeVertices","tolerance","hashToIndex","indices","vertexCount","nextIndex","attributeNames","attrArrays","morphAttrsArrays","newIndices","getters","l","name","morphAttr","decimalShift","shiftMultiplier","hash","k","newarray","newMorphArrays","getterFunc","m","ml","result","oldAttribute","buffer","BufferAttribute","oldMorphAttribute","buffer2","morphAttribute","transmission_pars_fragment_default","transmission_fragment_default","rewriteVertex","vertex","shader","baseMaterial","materialParameters","depthOnBeforeCompile","isCustomTransmission","depthMaterial","WOBBLE3D_PARAMS","transmission_pars_fragment","transmission_fragment","depthMat","useCreateWobble3D","wobbleGeometry","userData","useWobble3D","RootState","useAddMesh","Easing","x","c2","c4","c5","getHash","input","useBeat","bpm","ease","rhythm","easing","beat","floor","fract","useFPSLimiter","fps","interval","prevTime","tick","errorHandler","domLength","textureLength","createMesh","child","useIntersectionHandler","intersectionObserverRef","intersectionDomRef","isIntersectingRef","isIntersectingOnceRef","observer","newArr","dom","callback","entries","entry","useUpdateDomRect","domRects","updateDomRects","resolutionRef","domElement","rect","useIsIntersecting","isIntersecting","once","createUseDomView","onView","onHidden","isView","id","filterIntersection","item","DOMSYNCER_PARAMS","useDomSyncer","dependencies","DOMRects","refreshTrigger","setRefreshTrigger","useState","updateKey","emptyTexture","intersectionHandler","useDomView","useCopyTexture","length","renderTargetArr","updateCopyTexture"],"mappings":"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","x_google_ignoreList":[123]} \ 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/planeVert.glsl","../src/libs/shaders/resolveShaders.ts","../src/utils/setOnBeforeCompile.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","../node_modules/three-stdlib/utils/BufferGeometryUtils.js","../src/fxs/3D/useWobble3D/shaders/transmission_pars_fragment.glsl","../src/fxs/3D/useWobble3D/shaders/transmission_fragment.glsl","../src/fxs/3D/useWobble3D/useMaterial.ts","../src/fxs/3D/useWobble3D/useCreateWobble3D.ts","../src/fxs/3D/useWobble3D/index.ts","../src/utils/useAddMesh.ts","../src/libs/easing.ts","../src/misc/useBeat.ts","../src/misc/useFPSLimiter.ts","../src/misc/useDomSyncer/utils/errorHandler.ts","../src/misc/useDomSyncer/shader/main.vert","../src/misc/useDomSyncer/shader/main.frag","../src/misc/useDomSyncer/utils/createMesh.ts","../src/misc/useDomSyncer/utils/useIntersectionHandler.ts","../src/misc/useDomSyncer/utils/useUpdateDomRect.ts","../src/misc/useDomSyncer/utils/useIsIntersecting.ts","../src/misc/useDomSyncer/utils/createUseDomView.ts","../src/misc/useDomSyncer/index.ts","../src/misc/useCopyTexture.ts"],"sourcesContent":["#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 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}","import * as THREE from \"three\";\n\nimport wobble3D from \"./shaderChunk/wobble3D.glsl\";\nimport snoise from \"./shaderChunk/snoise.glsl\";\nimport coverTexture from \"./shaderChunk/coverTexture.glsl\";\nimport fxBlending from \"./shaderChunk/fxBlending.glsl\";\nimport planeVert from \"./shaderChunk/planeVert.glsl\";\n\nconst SHADER_CHUNK: { [key: string]: string } = {\n wobble3D,\n snoise,\n coverTexture,\n fxBlending,\n planeVert,\n};\n\nconst includePattern = /^[ \\t]*#usf +<([\\w\\d./]+)>/gm;\n\nfunction includeReplacer(match: string, include: string) {\n let string = SHADER_CHUNK[include] || \"\";\n return resolveIncludes(string);\n}\n\nfunction resolveIncludes(string: string) {\n return string.replace(includePattern, includeReplacer);\n}\n\nexport const resolveShaders = (\n parameters: THREE.WebGLProgramParametersWithUniforms\n) => {\n parameters.vertexShader = resolveIncludes(parameters.vertexShader);\n parameters.fragmentShader = resolveIncludes(parameters.fragmentShader);\n};\n","import * as THREE from \"three\";\nimport { resolveShaders } from \"../libs/shaders/resolveShaders\";\n\ntype OnBeforeCompile = (\n parameters: THREE.WebGLProgramParametersWithUniforms,\n renderer: THREE.WebGLRenderer\n) => void;\n\nexport const setOnBeforeCompile = (\n onBeforeCompile?: OnBeforeCompile\n): OnBeforeCompile => {\n return (parameters, renderer) => {\n onBeforeCompile && onBeforeCompile(parameters, renderer);\n resolveShaders(parameters);\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 { 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uBuffer: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent\n transparent: true,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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_OPTION: THREE.RenderTargetOptions = {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n type: THREE.HalfFloatType,\n stencilBuffer: false,\n};\n\nexport type UseFboProps = {\n scene: THREE.Scene;\n camera: THREE.Camera;\n size: Size;\n /** If dpr is set, dpr will be multiplied, default : `false` */\n dpr?: number | false;\n /** Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false` */\n isSizeUpdate?: boolean;\n /** Defines the count of MSAA samples. Can only be used with WebGL 2. default : `0.0` */\n samples?: number;\n /** Renders to the depth buffer. Unlike the three.js, default : `false` */\n depthBuffer?: boolean;\n /** If set, the scene depth will be rendered to this texture. default : `false` */\n depthTexture?: boolean;\n};\n\nexport const renderFBO = ({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender,\n onSwap,\n}: {\n gl: THREE.WebGLRenderer;\n fbo: THREE.WebGLRenderTarget;\n scene: THREE.Scene;\n camera: THREE.Camera;\n onBeforeRender: () => void;\n onSwap?: () => void;\n}) => {\n gl.setRenderTarget(fbo);\n onBeforeRender();\n gl.clear();\n gl.render(scene, camera);\n onSwap && onSwap();\n gl.setRenderTarget(null);\n gl.clear();\n};\n\ntype UpdateRenderTarget = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseSingleFBOReturn = [THREE.WebGLRenderTarget, UpdateRenderTarget];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default:false\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default:false\n * @returns [THREE.WebGLRenderTarget , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useSingleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseSingleFBOReturn => {\n const renderTarget = useRef();\n\n const resolution = useResolution(size, dpr);\n\n renderTarget.current = useMemo(\n () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n if (isSizeUpdate) {\n renderTarget.current?.setSize(resolution.x, resolution.y);\n }\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp?.dispose();\n };\n }, []);\n\n const updateRenderTarget: UpdateRenderTarget = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current!;\n renderFBO({\n gl,\n fbo,\n scene,\n camera,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTarget.current, updateRenderTarget];\n};\n","import * as THREE from \"three\";\nimport { useCallback, useEffect, useMemo, useRef } from \"react\";\nimport { FBO_OPTION, UseFboProps, renderFBO } from \"./useSingleFBO\";\nimport { useResolution } from \"./useResolution\";\n\nexport type DoubleRenderTarget = {\n read: THREE.WebGLRenderTarget | null;\n write: THREE.WebGLRenderTarget | null;\n};\n\ninterface WebGLDoubleRenderTarget extends DoubleRenderTarget {\n swap: () => void;\n}\n\ntype FBOUpdateFunction = (\n gl: THREE.WebGLRenderer,\n /** call before FBO is rendered */\n onBeforeRender?: ({\n read,\n write,\n }: {\n read: THREE.Texture;\n write: THREE.Texture;\n }) => void\n) => THREE.Texture;\n\ntype UseDoubleFBOReturn = [\n { read: THREE.WebGLRenderTarget; write: THREE.WebGLRenderTarget },\n FBOUpdateFunction\n];\n\n/**\n * @param dpr If dpr is set, dpr will be multiplied, default : `false`\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false`\n * @returns [{read:THREE.WebGLRenderTarget,write:THREE.WebGLRenderTarget} , updateFBO] -Receives the RenderTarget as the first argument and the update function as the second argument.\n */\nexport const useDoubleFBO = ({\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n}: UseFboProps): UseDoubleFBOReturn => {\n const renderTarget = useRef({\n read: null,\n write: null,\n swap: function () {\n let temp = this.read;\n this.read = this.write;\n this.write = temp;\n },\n });\n\n const resolution = useResolution(size, dpr);\n\n const initRenderTargets = useMemo(() => {\n const read = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n const write = new THREE.WebGLRenderTarget(resolution.x, resolution.y, {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n });\n\n if (depthTexture) {\n read.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n write.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n\n return { read, write };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n renderTarget.current.read = initRenderTargets.read;\n renderTarget.current.write = initRenderTargets.write;\n\n if (isSizeUpdate) {\n renderTarget.current.read?.setSize(resolution.x, resolution.y);\n renderTarget.current.write?.setSize(resolution.x, resolution.y);\n }\n\n useEffect(() => {\n const temp = renderTarget.current;\n return () => {\n temp.read?.dispose();\n temp.write?.dispose();\n };\n }, []);\n\n const updateRenderTarget: FBOUpdateFunction = useCallback(\n (gl, onBeforeRender) => {\n const fbo = renderTarget.current;\n renderFBO({\n gl,\n scene,\n camera,\n fbo: fbo.write!,\n onBeforeRender: () =>\n onBeforeRender &&\n onBeforeRender({\n read: fbo.read!.texture,\n write: fbo.write!.texture,\n }),\n onSwap: () => fbo.swap(),\n });\n return fbo.read?.texture as THREE.Texture;\n },\n [scene, camera]\n );\n\n return [\n { read: renderTarget.current.read, write: renderTarget.current.write },\n updateRenderTarget,\n ];\n};\n","import { Dpr } from \"../fxs/types\";\n\nexport const getDpr = (\n dpr: Dpr\n): { shader: number | false; fbo: number | false } => {\n if (typeof dpr === \"number\") {\n return { shader: dpr, fbo: dpr };\n }\n return {\n shader: dpr.shader ?? false,\n fbo: dpr.fbo ?? false,\n };\n};\n","import * as THREE from \"three\";\nimport { useMesh } from \"./useMesh\";\nimport { useCamera } from \"../../../utils/useCamera\";\nimport { useCallback, useMemo, useRef } from \"react\";\nimport { RootState } from \"@react-three/fiber\";\nimport { PointerValues, usePointer } from \"../../../misc/usePointer\";\nimport {\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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useDoubleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(BRUSH_PARAMS);\n\n const pressureEnd = useRef(null);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class AdvectionMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uSource: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n dt: { value: number };\n dissipation: { value: number };\n };\n}\n\nexport const useAdvectionMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class DivergenceMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useDivergenceMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const divergenceMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class PressureMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uDivergence: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const usePressureMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const pressureMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: null },\n uDivergence: { value: null },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class CurlMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useCurlMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const curlMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class VorticityMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uVelocity: { value: THREE.Texture };\n uCurl: { value: THREE.Texture };\n curl: { value: number };\n dt: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useVorticityMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const vorticityMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uVelocity: { value: null },\n uCurl: { value: null },\n curl: { value: 0 },\n dt: { value: DELTA_TIME },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class ClearMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uTexture: { value: THREE.Texture };\n value: { value: number };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useClearMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const advectionMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n value: { value: 0.0 },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\n\nexport class GradientSubtractMaterial extends THREE.ShaderMaterial {\n uniforms!: {\n uPressure: { value: THREE.Texture };\n uVelocity: { value: THREE.Texture };\n texelSize: { value: THREE.Vector2 };\n };\n}\n\nexport const useGradientSubtractMaterial = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const gradientSubtractMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uPressure: { value: DEFAULT_TEXTURE },\n uVelocity: { value: DEFAULT_TEXTURE },\n texelSize: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\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 = ({\n onBeforeCompile,\n uniforms,\n}: MaterialProps) => {\n const splatMaterial = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]);\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 density_dissipation?: number;\n /** velocity dissipation , default : `0.99` */\n velocity_dissipation?: number;\n /** velocity acceleration , default : `10.0` */\n velocity_acceleration?: number;\n /** pressure dissipation , default : `0.9` */\n pressure_dissipation?: number;\n /** pressure iterations. affects performance , default : `20` */\n pressure_iterations?: number;\n /** curl_strength , default : `35` */\n curl_strength?: number;\n /** splat radius , default : `0.002` */\n splat_radius?: number;\n /** Fluid Color.THREE.Vector3 Alternatively, it accepts a function that returns THREE.Vector3.The function takes velocity:THREE.Vector2 as an argument. , default : `THREE.Vector3(1.0, 1.0, 1.0)` */\n fluid_color?:\n | ((velocity: THREE.Vector2) => THREE.Vector3)\n | THREE.Vector3\n | THREE.Color;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type FluidObject = {\n scene: THREE.Scene;\n mesh: THREE.Mesh;\n materials: FluidMaterials;\n camera: THREE.Camera;\n renderTarget: {\n velocity: DoubleRenderTarget;\n density: DoubleRenderTarget;\n curl: THREE.WebGLRenderTarget;\n divergence: THREE.WebGLRenderTarget;\n pressure: DoubleRenderTarget;\n };\n output: THREE.Texture;\n};\n\nexport const FLUID_PARAMS: FluidParams = Object.freeze({\n density_dissipation: 0.98,\n velocity_dissipation: 0.99,\n velocity_acceleration: 10.0,\n pressure_dissipation: 0.9,\n pressure_iterations: 20,\n curl_strength: 35,\n splat_radius: 0.002,\n fluid_color: new THREE.Vector3(1.0, 1.0, 1.0),\n pointerValues: false,\n});\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useFluid = ({\n size,\n dpr,\n samples,\n isSizeUpdate,\n customFluidProps,\n}: {\n /** you can add `onBeforeComile` of the next material.`initial`,`curl`,`vorticity`,`advection`,`divergence`,`pressure`,`clear`,`gradientSubtract`,`splat` \n\t * ```ts\n\t * fluidOnBeforeCompile: {\n vorticity: {\n onBeforeCompile: (shader) => console.log(shader),\n\t\t\t\tuniforms:{\n\t\t\t\t\thoge: { value: 0.0 },\n\t\t\t\t}\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 }),\n [scene, camera, size, samples, _dpr.fbo, isSizeUpdate]\n );\n const [velocityFBO, updateVelocityFBO] = useDoubleFBO(fboProps);\n const [densityFBO, updateDensityFBO] = useDoubleFBO(fboProps);\n const [curlFBO, updateCurlFBO] = useSingleFBO(fboProps);\n const [divergenceFBO, updateDivergenceFBO] = useSingleFBO(fboProps);\n const [pressureFBO, updatePressureFBO] = useDoubleFBO(fboProps);\n\n const 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.velocity_dissipation!\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.density_dissipation!\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.velocity_acceleration!)\n );\n updateParamsList.splat(\n \"color\",\n spaltVec.current.set(scaledDiff.x, scaledDiff.y, 1.0)\n );\n updateParamsList.splat(\"radius\", params.splat_radius!);\n });\n updateDensityFBO(gl, ({ read }) => {\n setMeshMaterial(materials.splatMaterial);\n updateParamsList.splat(\"uTarget\", read);\n const color: THREE.Vector3 | THREE.Color =\n typeof params.fluid_color === \"function\"\n ? params.fluid_color(pointerValues.velocity)\n : params.fluid_color!;\n 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.curl_strength!);\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.pressure_dissipation!);\n });\n\n setMeshMaterial(materials.pressureMaterial);\n updateParamsList.pressure(\"uDivergence\", divergenceTex);\n let pressureTexTemp: THREE.Texture;\n for (let i = 0; i < params.pressure_iterations!; 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","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}","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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\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 uniforms: {\n uOpacity: { value: 0.0 },\n uMap: { value: texture || DEFAULT_TEXTURE },\n ...uniforms,\n },\n blending: THREE.AdditiveBlending,\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent.\n transparent: true,\n });\n return mat;\n }, [texture, uniforms]);\n\n const meshArr = useMemo(() => {\n const temp = [];\n for (let i = 0; i < max; i++) {\n const clonedMat = material.clone();\n\n clonedMat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\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 }, [onBeforeCompile, 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 fadeout_speed?: number;\n /** scale rate, default : `0.3` */\n scale?: number;\n /** alpha, default : `0.6` */\n alpha?: number;\n /** When calling usePointer in a frame loop, setting PointerValues ​​to this value prevents double calls , default : `false` */\n pointerValues?: PointerValues | false;\n};\n\nexport type RippleObject = {\n scene: THREE.Scene;\n meshArr: THREE.Mesh[];\n camera: THREE.Camera;\n renderTarget: THREE.WebGLRenderTarget;\n output: THREE.Texture;\n};\n\nexport const RIPPLE_PARAMS: RippleParams = Object.freeze({\n frequency: 0.01,\n rotation: 0.05,\n fadeout_speed: 0.9,\n scale: 0.3,\n alpha: 0.6,\n pointerValues: false,\n});\n\ninterface UseRippleProps extends HooksProps {\n /** texture applied to ripple */\n texture?: THREE.Texture;\n /** ripple size, default:64 */\n scale?: number;\n /** ripple max length, default:100 */\n max?: number;\n}\n\n/**\n * @link https://github.com/FunTechInc/use-shader-fx?tab=readme-ov-file#usage\n */\nexport const useRipple = ({\n texture,\n scale = 64,\n max = 100,\n size,\n dpr,\n samples,\n isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: UseRippleProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const meshArr = useMesh({\n scale: scale,\n max: max,\n texture,\n scene,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const updatePointer = usePointer();\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(RIPPLE_PARAMS);\n\n const currentWave = useRef(0);\n\n const 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.fadeout_speed! * mesh.scale.x + params.scale!;\n mesh.scale.y = mesh.scale.x;\n const opacity = material.uniforms.uOpacity.value;\n setUniform(material)(\n \"uOpacity\",\n opacity * params.fadeout_speed!\n );\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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTime: { value: 0.0 },\n scale: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(NOISE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: 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: { value: COLORSTRATA_PARAMS.laminateInterval },\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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(COLORSTRATA_PARAMS);\n\n const updateValue = setUniform(material);\n 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 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(MARBLE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(COSPALETTE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uColor0: { value: DUOTONE_PARAMS.color0 },\n uColor1: { value: DUOTONE_PARAMS.color1 },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(DUOTONE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(BLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { useEffect, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { useResolution } from \"../../../utils/useResolution\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { setUniform } from \"../../../utils/setUniforms\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { FXTEXTURE_PARAMS } from \".\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture0: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(FXTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_brightness: { value: BRIGHTNESSPICKER_PARAMS.brightness },\n u_min: { value: BRIGHTNESSPICKER_PARAMS.min },\n u_max: { value: BRIGHTNESSPICKER_PARAMS.max },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(\n BRIGHTNESSPICKER_PARAMS\n );\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n uMapIntensity: { value: FXBLENDING_PARAMS.mapIntensity },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(FXBLENDING_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uMap: { value: DEFAULT_TEXTURE },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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 uniforms,\n onBeforeCompile,\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 });\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\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\nvoid main() {\n\tvec4 tex = texture2D(u_texture, vUv);\n\tvec3 hsv = rgb2hsv(tex.rgb);\n\thsv.y *= u_saturation;\n\thsv.z *= u_brightness;\n\tvec3 final = hsv2rgb(hsv);\n\tgl_FragColor = vec4(final, tex.a);\n}\n\n","import * as THREE from \"three\";\nimport vertexShader from \"./shader/main.vert\";\nimport fragmentShader from \"./shader/main.frag\";\nimport { useMemo } from \"react\";\nimport { Size } from \"@react-three/fiber\";\nimport { useAddObject } from \"../../../utils/useAddObject\";\nimport { MaterialProps } from \"../../types\";\nimport {\n MATERIAL_BASIC_PARAMS,\n DEFAULT_TEXTURE,\n} from \"../../../libs/constants\";\nimport { HSV_PARAMS } from \".\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: DEFAULT_TEXTURE },\n u_brightness: { value: HSV_PARAMS.brightness },\n u_saturation: { value: HSV_PARAMS.saturation },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n uniforms,\n onBeforeCompile,\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 });\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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uResolution: { value: new THREE.Vector2() },\n uTextureResolution: { value: new THREE.Vector2() },\n uTexture: { value: DEFAULT_TEXTURE },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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 uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n dpr: _dpr.fbo,\n size,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] =\n useParams(COVERTEXTURE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uResolution: { value: new THREE.Vector2(0, 0) },\n uBlurSize: { value: SIMPLEBLUR_PARAMS.blurSize },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateTempTexture] = useDoubleFBO(fboProps);\n const [params, setParams] = useParams(SIMPLEBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n const 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 const iterations = params.blurPower!;\n for (let i = 0; i < iterations; i++) {\n updateValue(\"uTexture\", _tempTexture);\n _tempTexture = updateTempTexture(gl);\n }\n\n return _tempTexture;\n },\n [updateTempTexture, updateValue, 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\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, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(MOTIONBLUR_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uEpicenter: { value: WAVE_PARAMS.epicenter },\n uProgress: { value: WAVE_PARAMS.progress },\n uStrength: { value: WAVE_PARAMS.strength },\n uWidth: { value: WAVE_PARAMS.width },\n uMode: { value: 0 },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({ scene, uniforms, onBeforeCompile });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(WAVE_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n scene: THREE.Scene;\n size: Size;\n dpr: number | false;\n} & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: 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 ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n\n const [params, setParams] = useParams(CHROMAKEY_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: { scene: THREE.Scene; size: Size; dpr: number | false } & MaterialProps) => {\n const geometry = useMemo(() => new THREE.PlaneGeometry(2, 2), []);\n const material = useMemo(() => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n uTexture: { value: DEFAULT_TEXTURE },\n uBackbuffer: { value: DEFAULT_TEXTURE },\n uTime: { value: 0 },\n uPointer: { value: new THREE.Vector2() },\n uResolution: { value: new THREE.Vector2() },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [onBeforeCompile, uniforms]) as BlankMaterial;\n\n const resolution = useResolution(size, dpr);\n setUniform(material)(\"uResolution\", resolution.clone());\n\n const mesh = useAddObject(scene, geometry, material, THREE.Mesh);\n\n return { material, mesh };\n};\n","import { useCallback, useMemo } from \"react\";\nimport * as THREE from \"three\";\nimport { RootState } from \"@react-three/fiber\";\nimport { BlankMaterial, 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 isSizeUpdate,\n uniforms,\n onBeforeCompile,\n}: HooksProps): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const { material, mesh } = useMesh({\n scene,\n size,\n dpr: _dpr.shader,\n uniforms,\n onBeforeCompile,\n });\n const camera = useCamera(size);\n\n const fboProps = useMemo(\n () => ({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n }),\n [scene, camera, size, _dpr.fbo, samples, isSizeUpdate]\n ) as UseFboProps;\n\n const [renderTarget, updateRenderTarget] = useDoubleFBO(fboProps);\n\n const [params, setParams] = useParams(BLANK_PARAMS);\n\n const updateValue = setUniform(material);\n 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 { setOnBeforeCompile } from \"../../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n size: Size;\n dpr: number | false;\n geometry: THREE.BufferGeometry;\n positions?: Float32Array[];\n uvs?: Float32Array[];\n mapArray?: THREE.Texture[];\n} & MaterialProps) => {\n const modifiedPositions = useMemo(\n () => modifyAttributes(positions, geometry, \"position\", 3),\n [positions, geometry]\n );\n\n const modifiedUvs = useMemo(\n () => modifyAttributes(uvs, geometry, \"uv\", 2),\n [uvs, geometry]\n );\n\n const material = useMemo(() => {\n if (modifiedPositions.length !== modifiedUvs.length) {\n ISDEV &&\n console.log(\"use-shader-fx:positions and uvs are not matched\");\n }\n\n // vertex\n const rewritedVertexShader = rewriteVertexShader(\n modifiedUvs,\n geometry,\n \"uv\",\n rewriteVertexShader(\n modifiedPositions,\n geometry,\n \"position\",\n vertexShader,\n 3\n ),\n 2\n );\n\n // fragment\n const { rewritedFragmentShader, mapArrayUniforms } =\n rewriteFragmentShader(mapArray, fragmentShader);\n\n const mat = new THREE.ShaderMaterial({\n vertexShader: rewritedVertexShader,\n fragmentShader: rewritedFragmentShader,\n blending: THREE.AdditiveBlending,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent\n transparent: true,\n uniforms: {\n uResolution: { value: new THREE.Vector2(0, 0) },\n uMorphProgress: { value: MORPHPARTICLES_PARAMS.morphProgress },\n uBlurAlpha: { value: MORPHPARTICLES_PARAMS.blurAlpha },\n uBlurRadius: { value: MORPHPARTICLES_PARAMS.blurRadius },\n uPointSize: { value: MORPHPARTICLES_PARAMS.pointSize },\n uPointAlpha: { value: MORPHPARTICLES_PARAMS.pointAlpha },\n uPicture: { value: 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: { value: MORPHPARTICLES_PARAMS.wobbleStrength },\n uWarpPositionFrequency: {\n value: MORPHPARTICLES_PARAMS.warpPositionFrequency,\n },\n uWarpTimeFrequency: {\n value: MORPHPARTICLES_PARAMS.warpTimeFrequency,\n },\n uWarpStrength: { value: MORPHPARTICLES_PARAMS.warpStrength },\n uDisplacement: { value: 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: { value: MORPHPARTICLES_PARAMS.sizeRandomMin },\n uSizeRandomMax: { value: MORPHPARTICLES_PARAMS.sizeRandomMax },\n uDivergence: { value: MORPHPARTICLES_PARAMS.divergence },\n uDivergencePoint: { value: MORPHPARTICLES_PARAMS.divergencePoint },\n ...mapArrayUniforms,\n ...uniforms,\n },\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n return mat;\n }, [\n geometry,\n modifiedPositions,\n modifiedUvs,\n mapArray,\n onBeforeCompile,\n uniforms,\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 uniforms,\n onBeforeCompile,\n}: Create3DHooksProps &\n UseCreateMorphParticlesProps): UseCreateMorphParticlesReturn => {\n const _dpr = getDpr(dpr);\n\n const morphGeometry = useMemo(() => {\n const geo = geometry || new THREE.SphereGeometry(1, 32, 32);\n geo.setIndex(null);\n // Since it is a particle, normal is not necessary\n geo.deleteAttribute(\"normal\");\n return geo;\n }, [geometry]);\n\n const { material, modifiedPositions, modifiedUvs } = useMaterial({\n size,\n dpr: _dpr.shader,\n geometry: morphGeometry,\n positions,\n uvs,\n mapArray,\n uniforms,\n onBeforeCompile,\n });\n\n const { points, interactiveMesh } = useCreateObject({\n scene,\n geometry: morphGeometry,\n material,\n });\n\n const updateValue = setUniform(material);\n const 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 camera,\n geometry,\n positions,\n uvs,\n uniforms,\n onBeforeCompile,\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 uniforms,\n onBeforeCompile,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n });\n\n const updateFx = useCallback(\n (\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 { BufferGeometry, BufferAttribute, InterleavedBuffer, InterleavedBufferAttribute, TrianglesDrawMode, TriangleFanDrawMode, TriangleStripDrawMode, Vector3, Float32BufferAttribute } from \"three\";\nimport { getWithKey } from \"../types/helpers.js\";\nconst mergeBufferGeometries = (geometries, useGroups) => {\n const isIndexed = geometries[0].index !== null;\n const attributesUsed = new Set(Object.keys(geometries[0].attributes));\n const morphAttributesUsed = new Set(Object.keys(geometries[0].morphAttributes));\n const attributes = {};\n const morphAttributes = {};\n const morphTargetsRelative = geometries[0].morphTargetsRelative;\n const mergedGeometry = new BufferGeometry();\n let offset = 0;\n geometries.forEach((geom, i) => {\n let attributesCount = 0;\n if (isIndexed !== (geom.index !== null)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.\"\n );\n return null;\n }\n for (let name in geom.attributes) {\n if (!attributesUsed.has(name)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.'\n );\n return null;\n }\n if (attributes[name] === void 0) {\n attributes[name] = [];\n }\n attributes[name].push(geom.attributes[name]);\n attributesCount++;\n }\n if (attributesCount !== attributesUsed.size) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". Make sure all geometries have the same number of attributes.\"\n );\n return null;\n }\n if (morphTargetsRelative !== geom.morphTargetsRelative) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". .morphTargetsRelative must be consistent throughout all geometries.\"\n );\n return null;\n }\n for (let name in geom.morphAttributes) {\n if (!morphAttributesUsed.has(name)) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". .morphAttributes must be consistent throughout all geometries.\"\n );\n return null;\n }\n if (morphAttributes[name] === void 0)\n morphAttributes[name] = [];\n morphAttributes[name].push(geom.morphAttributes[name]);\n }\n mergedGeometry.userData.mergedUserData = mergedGeometry.userData.mergedUserData || [];\n mergedGeometry.userData.mergedUserData.push(geom.userData);\n if (useGroups) {\n let count;\n if (geom.index) {\n count = geom.index.count;\n } else if (geom.attributes.position !== void 0) {\n count = geom.attributes.position.count;\n } else {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index \" + i + \". The geometry must have either an index or a position attribute\"\n );\n return null;\n }\n mergedGeometry.addGroup(offset, count, i);\n offset += count;\n }\n });\n if (isIndexed) {\n let indexOffset = 0;\n const mergedIndex = [];\n geometries.forEach((geom) => {\n const index = geom.index;\n for (let j = 0; j < index.count; ++j) {\n mergedIndex.push(index.getX(j) + indexOffset);\n }\n indexOffset += geom.attributes.position.count;\n });\n mergedGeometry.setIndex(mergedIndex);\n }\n for (let name in attributes) {\n const mergedAttribute = mergeBufferAttributes(attributes[name]);\n if (!mergedAttribute) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the \" + name + \" attribute.\"\n );\n return null;\n }\n mergedGeometry.setAttribute(name, mergedAttribute);\n }\n for (let name in morphAttributes) {\n const numMorphTargets = morphAttributes[name][0].length;\n if (numMorphTargets === 0)\n break;\n mergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n mergedGeometry.morphAttributes[name] = [];\n for (let i = 0; i < numMorphTargets; ++i) {\n const morphAttributesToMerge = [];\n for (let j = 0; j < morphAttributes[name].length; ++j) {\n morphAttributesToMerge.push(morphAttributes[name][j][i]);\n }\n const mergedMorphAttribute = mergeBufferAttributes(morphAttributesToMerge);\n if (!mergedMorphAttribute) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the \" + name + \" morphAttribute.\"\n );\n return null;\n }\n mergedGeometry.morphAttributes[name].push(mergedMorphAttribute);\n }\n }\n return mergedGeometry;\n};\nconst mergeBufferAttributes = (attributes) => {\n let TypedArray = void 0;\n let itemSize = void 0;\n let normalized = void 0;\n let arrayLength = 0;\n attributes.forEach((attr) => {\n if (TypedArray === void 0) {\n TypedArray = attr.array.constructor;\n }\n if (TypedArray !== attr.array.constructor) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.\"\n );\n return null;\n }\n if (itemSize === void 0)\n itemSize = attr.itemSize;\n if (itemSize !== attr.itemSize) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.\"\n );\n return null;\n }\n if (normalized === void 0)\n normalized = attr.normalized;\n if (normalized !== attr.normalized) {\n console.error(\n \"THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.\"\n );\n return null;\n }\n arrayLength += attr.array.length;\n });\n if (TypedArray && itemSize) {\n const array = new TypedArray(arrayLength);\n let offset = 0;\n attributes.forEach((attr) => {\n array.set(attr.array, offset);\n offset += attr.array.length;\n });\n return new BufferAttribute(array, itemSize, normalized);\n }\n};\nconst interleaveAttributes = (attributes) => {\n let TypedArray = void 0;\n let arrayLength = 0;\n let stride = 0;\n for (let i = 0, l = attributes.length; i < l; ++i) {\n const attribute = attributes[i];\n if (TypedArray === void 0)\n TypedArray = attribute.array.constructor;\n if (TypedArray !== attribute.array.constructor) {\n console.error(\"AttributeBuffers of different types cannot be interleaved\");\n return null;\n }\n arrayLength += attribute.array.length;\n stride += attribute.itemSize;\n }\n const interleavedBuffer = new InterleavedBuffer(new TypedArray(arrayLength), stride);\n let offset = 0;\n const res = [];\n const getters = [\"getX\", \"getY\", \"getZ\", \"getW\"];\n const setters = [\"setX\", \"setY\", \"setZ\", \"setW\"];\n for (let j = 0, l = attributes.length; j < l; j++) {\n const attribute = attributes[j];\n const itemSize = attribute.itemSize;\n const count = attribute.count;\n const iba = new InterleavedBufferAttribute(interleavedBuffer, itemSize, offset, attribute.normalized);\n res.push(iba);\n offset += itemSize;\n for (let c = 0; c < count; c++) {\n for (let k = 0; k < itemSize; k++) {\n const set = getWithKey(iba, setters[k]);\n const get = getWithKey(attribute, getters[k]);\n set(c, get(c));\n }\n }\n }\n return res;\n};\nfunction estimateBytesUsed(geometry) {\n let mem = 0;\n for (let name in geometry.attributes) {\n const attr = geometry.getAttribute(name);\n mem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n }\n const indices = geometry.getIndex();\n mem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n return mem;\n}\nfunction mergeVertices(geometry, tolerance = 1e-4) {\n tolerance = Math.max(tolerance, Number.EPSILON);\n const hashToIndex = {};\n const indices = geometry.getIndex();\n const positions = geometry.getAttribute(\"position\");\n const vertexCount = indices ? indices.count : positions.count;\n let nextIndex = 0;\n const attributeNames = Object.keys(geometry.attributes);\n const attrArrays = {};\n const morphAttrsArrays = {};\n const newIndices = [];\n const getters = [\"getX\", \"getY\", \"getZ\", \"getW\"];\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n const name = attributeNames[i];\n attrArrays[name] = [];\n const morphAttr = geometry.morphAttributes[name];\n if (morphAttr) {\n morphAttrsArrays[name] = new Array(morphAttr.length).fill(0).map(() => []);\n }\n }\n const decimalShift = Math.log10(1 / tolerance);\n const shiftMultiplier = Math.pow(10, decimalShift);\n for (let i = 0; i < vertexCount; i++) {\n const index = indices ? indices.getX(i) : i;\n let hash = \"\";\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const itemSize = attribute.itemSize;\n for (let k = 0; k < itemSize; k++) {\n hash += `${~~(attribute[getters[k]](index) * shiftMultiplier)},`;\n }\n }\n if (hash in hashToIndex) {\n newIndices.push(hashToIndex[hash]);\n } else {\n for (let j = 0, l = attributeNames.length; j < l; j++) {\n const name = attributeNames[j];\n const attribute = geometry.getAttribute(name);\n const morphAttr = geometry.morphAttributes[name];\n const itemSize = attribute.itemSize;\n const newarray = attrArrays[name];\n const newMorphArrays = morphAttrsArrays[name];\n for (let k = 0; k < itemSize; k++) {\n const getterFunc = getters[k];\n newarray.push(attribute[getterFunc](index));\n if (morphAttr) {\n for (let m = 0, ml = morphAttr.length; m < ml; m++) {\n newMorphArrays[m].push(morphAttr[m][getterFunc](index));\n }\n }\n }\n }\n hashToIndex[hash] = nextIndex;\n newIndices.push(nextIndex);\n nextIndex++;\n }\n }\n const result = geometry.clone();\n for (let i = 0, l = attributeNames.length; i < l; i++) {\n const name = attributeNames[i];\n const oldAttribute = geometry.getAttribute(name);\n const buffer = new oldAttribute.array.constructor(attrArrays[name]);\n const attribute = new BufferAttribute(buffer, oldAttribute.itemSize, oldAttribute.normalized);\n result.setAttribute(name, attribute);\n if (name in morphAttrsArrays) {\n for (let j = 0; j < morphAttrsArrays[name].length; j++) {\n const oldMorphAttribute = geometry.morphAttributes[name][j];\n const buffer2 = new oldMorphAttribute.array.constructor(morphAttrsArrays[name][j]);\n const morphAttribute = new BufferAttribute(buffer2, oldMorphAttribute.itemSize, oldMorphAttribute.normalized);\n result.morphAttributes[name][j] = morphAttribute;\n }\n }\n }\n result.setIndex(newIndices);\n return result;\n}\nfunction toTrianglesDrawMode(geometry, drawMode) {\n if (drawMode === TrianglesDrawMode) {\n console.warn(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.\");\n return geometry;\n }\n if (drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode) {\n let index = geometry.getIndex();\n if (index === null) {\n const indices = [];\n const position = geometry.getAttribute(\"position\");\n if (position !== void 0) {\n for (let i = 0; i < position.count; i++) {\n indices.push(i);\n }\n geometry.setIndex(indices);\n index = geometry.getIndex();\n } else {\n console.error(\n \"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.\"\n );\n return geometry;\n }\n }\n const numberOfTriangles = index.count - 2;\n const newIndices = [];\n if (index) {\n if (drawMode === TriangleFanDrawMode) {\n for (let i = 1; i <= numberOfTriangles; i++) {\n newIndices.push(index.getX(0));\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n }\n } else {\n for (let i = 0; i < numberOfTriangles; i++) {\n if (i % 2 === 0) {\n newIndices.push(index.getX(i));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i + 2));\n } else {\n newIndices.push(index.getX(i + 2));\n newIndices.push(index.getX(i + 1));\n newIndices.push(index.getX(i));\n }\n }\n }\n }\n if (newIndices.length / 3 !== numberOfTriangles) {\n console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.\");\n }\n const newGeometry = geometry.clone();\n newGeometry.setIndex(newIndices);\n newGeometry.clearGroups();\n return newGeometry;\n } else {\n console.error(\"THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:\", drawMode);\n return geometry;\n }\n}\nfunction computeMorphedAttributes(object) {\n if (object.geometry.isBufferGeometry !== true) {\n console.error(\"THREE.BufferGeometryUtils: Geometry is not of type BufferGeometry.\");\n return null;\n }\n const _vA = new Vector3();\n const _vB = new Vector3();\n const _vC = new Vector3();\n const _tempA = new Vector3();\n const _tempB = new Vector3();\n const _tempC = new Vector3();\n const _morphA = new Vector3();\n const _morphB = new Vector3();\n const _morphC = new Vector3();\n function _calculateMorphedAttributeData(object2, material2, attribute, morphAttribute, morphTargetsRelative2, a2, b2, c2, modifiedAttributeArray) {\n _vA.fromBufferAttribute(attribute, a2);\n _vB.fromBufferAttribute(attribute, b2);\n _vC.fromBufferAttribute(attribute, c2);\n const morphInfluences = object2.morphTargetInfluences;\n if (\n // @ts-ignore\n material2.morphTargets && morphAttribute && morphInfluences\n ) {\n _morphA.set(0, 0, 0);\n _morphB.set(0, 0, 0);\n _morphC.set(0, 0, 0);\n for (let i2 = 0, il2 = morphAttribute.length; i2 < il2; i2++) {\n const influence = morphInfluences[i2];\n const morph = morphAttribute[i2];\n if (influence === 0)\n continue;\n _tempA.fromBufferAttribute(morph, a2);\n _tempB.fromBufferAttribute(morph, b2);\n _tempC.fromBufferAttribute(morph, c2);\n if (morphTargetsRelative2) {\n _morphA.addScaledVector(_tempA, influence);\n _morphB.addScaledVector(_tempB, influence);\n _morphC.addScaledVector(_tempC, influence);\n } else {\n _morphA.addScaledVector(_tempA.sub(_vA), influence);\n _morphB.addScaledVector(_tempB.sub(_vB), influence);\n _morphC.addScaledVector(_tempC.sub(_vC), influence);\n }\n }\n _vA.add(_morphA);\n _vB.add(_morphB);\n _vC.add(_morphC);\n }\n if (object2.isSkinnedMesh) {\n object2.boneTransform(a2, _vA);\n object2.boneTransform(b2, _vB);\n object2.boneTransform(c2, _vC);\n }\n modifiedAttributeArray[a2 * 3 + 0] = _vA.x;\n modifiedAttributeArray[a2 * 3 + 1] = _vA.y;\n modifiedAttributeArray[a2 * 3 + 2] = _vA.z;\n modifiedAttributeArray[b2 * 3 + 0] = _vB.x;\n modifiedAttributeArray[b2 * 3 + 1] = _vB.y;\n modifiedAttributeArray[b2 * 3 + 2] = _vB.z;\n modifiedAttributeArray[c2 * 3 + 0] = _vC.x;\n modifiedAttributeArray[c2 * 3 + 1] = _vC.y;\n modifiedAttributeArray[c2 * 3 + 2] = _vC.z;\n }\n const geometry = object.geometry;\n const material = object.material;\n let a, b, c;\n const index = geometry.index;\n const positionAttribute = geometry.attributes.position;\n const morphPosition = geometry.morphAttributes.position;\n const morphTargetsRelative = geometry.morphTargetsRelative;\n const normalAttribute = geometry.attributes.normal;\n const morphNormal = geometry.morphAttributes.position;\n const groups = geometry.groups;\n const drawRange = geometry.drawRange;\n let i, j, il, jl;\n let group, groupMaterial;\n let start, end;\n const modifiedPosition = new Float32Array(positionAttribute.count * positionAttribute.itemSize);\n const modifiedNormal = new Float32Array(normalAttribute.count * normalAttribute.itemSize);\n if (index !== null) {\n if (Array.isArray(material)) {\n for (i = 0, il = groups.length; i < il; i++) {\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n start = Math.max(group.start, drawRange.start);\n end = Math.min(group.start + group.count, drawRange.start + drawRange.count);\n for (j = start, jl = end; j < jl; j += 3) {\n a = index.getX(j);\n b = index.getX(j + 1);\n c = index.getX(j + 2);\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else {\n start = Math.max(0, drawRange.start);\n end = Math.min(index.count, drawRange.start + drawRange.count);\n for (i = start, il = end; i < il; i += 3) {\n a = index.getX(i);\n b = index.getX(i + 1);\n c = index.getX(i + 2);\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else if (positionAttribute !== void 0) {\n if (Array.isArray(material)) {\n for (i = 0, il = groups.length; i < il; i++) {\n group = groups[i];\n groupMaterial = material[group.materialIndex];\n start = Math.max(group.start, drawRange.start);\n end = Math.min(group.start + group.count, drawRange.start + drawRange.count);\n for (j = start, jl = end; j < jl; j += 3) {\n a = j;\n b = j + 1;\n c = j + 2;\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n groupMaterial,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n } else {\n start = Math.max(0, drawRange.start);\n end = Math.min(positionAttribute.count, drawRange.start + drawRange.count);\n for (i = start, il = end; i < il; i += 3) {\n a = i;\n b = i + 1;\n c = i + 2;\n _calculateMorphedAttributeData(\n object,\n material,\n positionAttribute,\n morphPosition,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedPosition\n );\n _calculateMorphedAttributeData(\n object,\n material,\n normalAttribute,\n morphNormal,\n morphTargetsRelative,\n a,\n b,\n c,\n modifiedNormal\n );\n }\n }\n }\n const morphedPositionAttribute = new Float32BufferAttribute(modifiedPosition, 3);\n const morphedNormalAttribute = new Float32BufferAttribute(modifiedNormal, 3);\n return {\n positionAttribute,\n normalAttribute,\n morphedPositionAttribute,\n morphedNormalAttribute\n };\n}\nfunction toCreasedNormals(geometry, creaseAngle = Math.PI / 3) {\n const creaseDot = Math.cos(creaseAngle);\n const hashMultiplier = (1 + 1e-10) * 100;\n const verts = [new Vector3(), new Vector3(), new Vector3()];\n const tempVec1 = new Vector3();\n const tempVec2 = new Vector3();\n const tempNorm = new Vector3();\n const tempNorm2 = new Vector3();\n function hashVertex(v) {\n const x = ~~(v.x * hashMultiplier);\n const y = ~~(v.y * hashMultiplier);\n const z = ~~(v.z * hashMultiplier);\n return `${x},${y},${z}`;\n }\n const resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;\n const posAttr = resultGeometry.attributes.position;\n const vertexMap = {};\n for (let i = 0, l = posAttr.count / 3; i < l; i++) {\n const i3 = 3 * i;\n const a = verts[0].fromBufferAttribute(posAttr, i3 + 0);\n const b = verts[1].fromBufferAttribute(posAttr, i3 + 1);\n const c = verts[2].fromBufferAttribute(posAttr, i3 + 2);\n tempVec1.subVectors(c, b);\n tempVec2.subVectors(a, b);\n const normal = new Vector3().crossVectors(tempVec1, tempVec2).normalize();\n for (let n = 0; n < 3; n++) {\n const vert = verts[n];\n const hash = hashVertex(vert);\n if (!(hash in vertexMap)) {\n vertexMap[hash] = [];\n }\n vertexMap[hash].push(normal);\n }\n }\n const normalArray = new Float32Array(posAttr.count * 3);\n const normAttr = new BufferAttribute(normalArray, 3, false);\n for (let i = 0, l = posAttr.count / 3; i < l; i++) {\n const i3 = 3 * i;\n const a = verts[0].fromBufferAttribute(posAttr, i3 + 0);\n const b = verts[1].fromBufferAttribute(posAttr, i3 + 1);\n const c = verts[2].fromBufferAttribute(posAttr, i3 + 2);\n tempVec1.subVectors(c, b);\n tempVec2.subVectors(a, b);\n tempNorm.crossVectors(tempVec1, tempVec2).normalize();\n for (let n = 0; n < 3; n++) {\n const vert = verts[n];\n const hash = hashVertex(vert);\n const otherNormals = vertexMap[hash];\n tempNorm2.set(0, 0, 0);\n for (let k = 0, lk = otherNormals.length; k < lk; k++) {\n const otherNorm = otherNormals[k];\n if (tempNorm.dot(otherNorm) > creaseDot) {\n tempNorm2.add(otherNorm);\n }\n }\n tempNorm2.normalize();\n normAttr.setXYZ(i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z);\n }\n }\n resultGeometry.setAttribute(\"normal\", normAttr);\n return resultGeometry;\n}\nexport {\n computeMorphedAttributes,\n estimateBytesUsed,\n interleaveAttributes,\n mergeBufferAttributes,\n mergeBufferGeometries,\n mergeVertices,\n toCreasedNormals,\n toTrianglesDrawMode\n};\n//# sourceMappingURL=BufferGeometryUtils.js.map\n","#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 { useMemo } from \"react\";\nimport transmission_pars_fragment from \"./shaders/transmission_pars_fragment.glsl\";\nimport transmission_fragment from \"./shaders/transmission_fragment.glsl\";\nimport { WOBBLE3D_PARAMS } from \".\";\nimport { MaterialProps } from \"../../types\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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\n/** You also need to rewrite the vertext shader of depthMaterial */\nconst rewriteVertex = (vertex: string) => {\n let shader = vertex;\n shader = shader.replace(\n \"#include \",\n `\n\t\tvec3 objectNormal = usf_Normal;\n\t\t#ifdef USE_TANGENT\n\t\tvec3 objectTangent = vec3( tangent.xyz );\n\t\t#endif`\n );\n // position\n shader = shader.replace(\n \"#include \",\n `\n\t\tvec3 transformed = usf_Position;`\n );\n\n // uniforms\n shader = shader.replace(\n \"void main() {\",\n `\n\t\tuniform float uTime;\n\t\tuniform float uWobblePositionFrequency;\n\t\tuniform float uWobbleTimeFrequency;\n\t\tuniform float uWobbleStrength;\n\t\tuniform float uWarpPositionFrequency;\n\t\tuniform float uWarpTimeFrequency;\n\t\tuniform float uWarpStrength;\n\t\tattribute vec4 tangent;\n\t\tvarying float vWobble;\n\t\tvarying vec2 vPosition;\n\t\t// edge\n\t\tvarying vec3 vEdgeNormal;\n\t\tvarying vec3 vEdgeViewPosition;\n\t\t#usf \n\t\tvoid main() {\n\t\t`\n );\n\n // vert\n shader = shader.replace(\n \"void main() {\",\n `\n\t\tvoid main() {\n\t\tvec3 usf_Position = position;\n\t\tvec3 usf_Normal = normal;\n\t\tvec3 biTangent = cross(normal, tangent.xyz);\n\t\t\n\t\t// Neighbours positions\n\t\tfloat shift = 0.01;\n\t\tvec3 positionA = usf_Position + tangent.xyz * shift;\n\t\tvec3 positionB = usf_Position + biTangent * shift;\n\t\t\n\t\t// wobble\n\t\tfloat wobble = (uWobbleStrength > 0.) ? getWobble(usf_Position) : 0.0;\n\t\tfloat wobblePositionA = (uWobbleStrength > 0.) ? getWobble(positionA) : 0.0;\n\t\tfloat wobblePositionB = (uWobbleStrength > 0.) ? getWobble(positionB) : 0.0;\n\t\t\n\t\tusf_Position += wobble * normal;\n\t\tpositionA += wobblePositionA * normal;\n\t\tpositionB += wobblePositionB * normal;\n\n\t\t// Compute normal\n\t\tvec3 toA = normalize(positionA - usf_Position);\n\t\tvec3 toB = normalize(positionB - usf_Position);\n\t\tusf_Normal = cross(toA, toB);\n\t\t\n\t\t// Varying\n\t\tvPosition = usf_Position.xy;\n\t\tvWobble = wobble/uWobbleStrength;\n\t\t\n\t\tvEdgeNormal = normalize(normalMatrix * usf_Normal);\n\t\tvec4 viewPosition = viewMatrix * modelMatrix * vec4(usf_Position, 1.0);\n\t\tvEdgeViewPosition = normalize(viewPosition.xyz);\n\t\t`\n );\n return shader;\n};\n\nexport type WobbleMaterialConstructor = new (opts: {\n [key: string]: any;\n}) => THREE.Material;\ntype WobbleMaterialParams =\n ConstructorParameters[0];\nexport interface WobbleMaterialProps\n extends MaterialProps {\n /** default:THREE.MeshPhysicalMaterial */\n baseMaterial?: T;\n materialParameters?: WobbleMaterialParams;\n /**\n * depthMaterial's onBeforeCompile\n * @param parameters — WebGL program parameters\n * @param renderer — WebGLRenderer Context that is initializing the material\n */\n depthOnBeforeCompile?: (\n parameters: THREE.WebGLProgramParametersWithUniforms,\n renderer: THREE.WebGLRenderer\n ) => 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 onBeforeCompile,\n depthOnBeforeCompile,\n isCustomTransmission = false,\n uniforms,\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 ...uniforms,\n },\n });\n\n mat.onBeforeCompile = (parameters, renderer) => {\n Object.assign(parameters.uniforms, mat.userData.uniforms);\n\n /********************\n\t\t\tvert\n\t\t\t********************/\n parameters.vertexShader = rewriteVertex(parameters.vertexShader);\n\n /********************\n\t\t\tfrag\n\t\t\t********************/\n // diffuse color , Manipulate color mixing ratio with `uColorMix`\n parameters.fragmentShader = parameters.fragmentShader.replace(\n \"#include \",\n `\n\t\t\t\t\t#include \n\n\t\t\t\t\tif (uEdgeThreshold > 0.0) {\n\t\t\t\t\t\tfloat edgeThreshold = dot(vEdgeNormal, -vEdgeViewPosition);\n\t\t\t\t\t\tdiffuseColor = edgeThreshold < uEdgeThreshold ? vec4(uEdgeColor, 1.0) : mix(diffuseColor, usf_DiffuseColor, uColorMix);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdiffuseColor = mix(diffuseColor, usf_DiffuseColor, uColorMix);\n\t\t\t\t\t}\n\t\t\t\t`\n );\n\n // frag\n parameters.fragmentShader = parameters.fragmentShader.replace(\n \"void main() {\",\n `\n\t\t\t\tuniform vec3 uColor0;\n\t\t\t\tuniform vec3 uColor1;\n\t\t\t\tuniform vec3 uColor2;\n\t\t\t\tuniform vec3 uColor3;\n\t\t\t\tuniform float uColorMix;\n\t\t\t\tuniform float uEdgeThreshold;\n\t\t\t\tuniform vec3 uEdgeColor;\n\t\t\t\t\n\t\t\t\t// transmission\n\t\t\t\tuniform float uChromaticAberration; \n\t\t\t\tuniform float uAnisotropicBlur; \n\t\t\t\tuniform float uTime;\n\t\t\t\tuniform float uDistortion;\n\t\t\t\tuniform float uDistortionScale;\n\t\t\t\tuniform float uTemporalDistortion;\n\t\t\t\tuniform float uRefractionSamples;\n\t\t\t\t\n\t\t\t\tfloat rand(float n){return fract(sin(n) * 43758.5453123);}\n\t\t\t\t#usf \n\n\t\t\t\tvarying float vWobble;\n\t\t\t\tvarying vec2 vPosition;\n\t\t\t\tvarying vec3 vEdgeNormal;\n\t\t\t\tvarying vec3 vEdgeViewPosition;\n\t\t\t\t\n\t\t\t\tvoid main(){\n\t\t\t\t\tvec4 usf_DiffuseColor = vec4(1.0);\n\t\t\t\t\tfloat colorWobbleMix = smoothstep(-1.,1.,vWobble);\n\t\t\t\t\tvec2 colorPosMix = vec2(smoothstep(-1.,1.,vPosition.x),smoothstep(-1.,1.,vPosition.y));\n\t\t\t\t\n\t\t\t\t\tusf_DiffuseColor.rgb = mix(mix(uColor0, uColor1, colorPosMix.x), mix(uColor2, uColor3, colorPosMix.y), colorWobbleMix);\n\t\t\t\t`\n );\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 setOnBeforeCompile(onBeforeCompile)(parameters, renderer);\n };\n mat.needsUpdate = true;\n\n /*===============================================\n\t\tdepthMaterial\n\t\t===============================================*/\n const depthMat = new THREE.MeshDepthMaterial({\n depthPacking: THREE.RGBADepthPacking,\n });\n depthMat.onBeforeCompile = (parameters, renderer) => {\n Object.assign(parameters.uniforms, mat.userData.uniforms);\n parameters.vertexShader = rewriteVertex(parameters.vertexShader);\n setOnBeforeCompile(depthOnBeforeCompile)(parameters, renderer);\n };\n depthMat.needsUpdate = true;\n\n return { material: mat, depthMaterial: depthMat };\n }, [\n materialParameters,\n baseMaterial,\n onBeforeCompile,\n depthOnBeforeCompile,\n uniforms,\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 onBeforeCompile,\n depthOnBeforeCompile,\n uniforms,\n}: UseCreateWobble3DProps &\n Create3DHooksProps &\n WobbleMaterialProps): UseCreateWobble3DReturn => {\n const wobbleGeometry = useMemo(() => {\n let geo = geometry || new THREE.IcosahedronGeometry(2, 20);\n geo = mergeVertices(geo);\n geo.computeTangents();\n return geo;\n }, [geometry]);\n const { material, depthMaterial } = useMaterial({\n baseMaterial,\n materialParameters,\n onBeforeCompile,\n depthOnBeforeCompile,\n uniforms,\n isCustomTransmission,\n });\n\n const mesh = useAddObject(scene, wobbleGeometry, material, THREE.Mesh);\n\n const userData = material.userData as Wobble3DMaterial;\n const updateValue = setUniform(userData);\n const 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 isSizeUpdate,\n camera,\n geometry,\n baseMaterial,\n materialParameters,\n uniforms,\n onBeforeCompile,\n depthOnBeforeCompile,\n isCustomTransmission,\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 uniforms,\n onBeforeCompile,\n depthOnBeforeCompile,\n isCustomTransmission,\n });\n\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n depthBuffer: true,\n });\n\n const updateFx = useCallback(\n (\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","export type EasingTypes =\n | \"easeInSine\"\n | \"easeOutSine\"\n | \"easeInOutSine\"\n | \"easeInQuad\"\n | \"easeOutQuad\"\n | \"easeInOutQuad\"\n | \"easeInCubic\"\n | \"easeOutCubic\"\n | \"easeInOutCubic\"\n | \"easeInQuart\"\n | \"easeOutQuart\"\n | \"easeInOutQuart\"\n | \"easeInQuint\"\n | \"easeOutQuint\"\n | \"easeInOutQuint\"\n | \"easeInExpo\"\n | \"easeOutExpo\"\n | \"easeInOutExpo\"\n | \"easeInCirc\"\n | \"easeOutCirc\"\n | \"easeInOutCirc\"\n | \"easeInBack\"\n | \"easeOutBack\"\n | \"easeInOutBack\"\n | \"easeInElastic\"\n | \"easeOutElastic\"\n | \"easeInOutElastic\"\n | \"easeInBounce\"\n | \"easeOutBounce\"\n | \"easeInOutBounce\";\n\ntype EasingFunctions = {\n [K in EasingTypes]: (x: number) => number;\n};\n\n/**\n * from https://github.com/ai/easings.net\n */\nexport const Easing: EasingFunctions = Object.freeze({\n easeInSine(x: number): number {\n return 1 - Math.cos((x * Math.PI) / 2);\n },\n easeOutSine(x: number): number {\n return Math.sin((x * Math.PI) / 2);\n },\n easeInOutSine(x: number): number {\n return -(Math.cos(Math.PI * x) - 1) / 2;\n },\n easeInQuad(x: number): number {\n return x * x;\n },\n easeOutQuad(x: number): number {\n return 1 - (1 - x) * (1 - x);\n },\n easeInOutQuad(x: number): number {\n return x < 0.5 ? 2 * x * x : 1 - Math.pow(-2 * x + 2, 2) / 2;\n },\n easeInCubic(x: number): number {\n return x * x * x;\n },\n easeOutCubic(x: number): number {\n return 1 - Math.pow(1 - x, 3);\n },\n easeInOutCubic(x: number): number {\n return x < 0.5 ? 4 * x * x * x : 1 - Math.pow(-2 * x + 2, 3) / 2;\n },\n easeInQuart(x: number): number {\n return x * x * x * x;\n },\n easeOutQuart(x: number): number {\n return 1 - Math.pow(1 - x, 4);\n },\n easeInOutQuart(x: number): number {\n return x < 0.5 ? 8 * x * x * x * x : 1 - Math.pow(-2 * x + 2, 4) / 2;\n },\n easeInQuint(x: number): number {\n return x * x * x * x * x;\n },\n easeOutQuint(x: number): number {\n return 1 - Math.pow(1 - x, 5);\n },\n easeInOutQuint(x: number): number {\n return x < 0.5 ? 16 * x * x * x * x * x : 1 - Math.pow(-2 * x + 2, 5) / 2;\n },\n easeInExpo(x: number): number {\n return x === 0 ? 0 : Math.pow(2, 10 * x - 10);\n },\n easeOutExpo(x: number): number {\n return x === 1 ? 1 : 1 - Math.pow(2, -10 * x);\n },\n easeInOutExpo(x: number): number {\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? Math.pow(2, 20 * x - 10) / 2\n : (2 - Math.pow(2, -20 * x + 10)) / 2;\n },\n easeInCirc(x: number): number {\n return 1 - Math.sqrt(1 - Math.pow(x, 2));\n },\n easeOutCirc(x: number): number {\n return Math.sqrt(1 - Math.pow(x - 1, 2));\n },\n easeInOutCirc(x: number): number {\n return x < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;\n },\n easeInBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return c3 * x * x * x - c1 * x * x;\n },\n easeOutBack(x: number): number {\n const c1 = 1.70158;\n const c3 = c1 + 1;\n\n return 1 + c3 * Math.pow(x - 1, 3) + c1 * Math.pow(x - 1, 2);\n },\n easeInOutBack(x: number): number {\n const c1 = 1.70158;\n const c2 = c1 * 1.525;\n\n return x < 0.5\n ? (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2\n : (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2;\n },\n easeInElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : -Math.pow(2, 10 * x - 10) * Math.sin((x * 10 - 10.75) * c4);\n },\n easeOutElastic(x: number): number {\n const c4 = (2 * Math.PI) / 3;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : Math.pow(2, -10 * x) * Math.sin((x * 10 - 0.75) * c4) + 1;\n },\n easeInOutElastic(x: number): number {\n const c5 = (2 * Math.PI) / 4.5;\n\n return x === 0\n ? 0\n : x === 1\n ? 1\n : x < 0.5\n ? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * c5)) / 2\n : (Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * c5)) / 2 +\n 1;\n },\n easeInBounce(x: number): number {\n return 1 - Easing.easeOutBounce(1 - x);\n },\n easeOutBounce(x: number): number {\n const n1 = 7.5625;\n const d1 = 2.75;\n\n if (x < 1 / d1) {\n return n1 * x * x;\n } else if (x < 2 / d1) {\n return n1 * (x -= 1.5 / d1) * x + 0.75;\n } else if (x < 2.5 / d1) {\n return n1 * (x -= 2.25 / d1) * x + 0.9375;\n } else {\n return n1 * (x -= 2.625 / d1) * x + 0.984375;\n }\n },\n easeInOutBounce(x: number): number {\n return x < 0.5\n ? (1 - Easing.easeOutBounce(1 - 2 * x)) / 2\n : (1 + Easing.easeOutBounce(2 * x - 1)) / 2;\n },\n});\n","import * as THREE from \"three\";\nimport { Easing, EasingTypes } from \"../libs/easing\";\nimport { useCallback } from \"react\";\n\n/** Returns a unique hash specific to the beat */\nfunction getHash(input: number) {\n let n = Math.sin(input * 12.9898) * 43758.5453;\n return n - Math.floor(n);\n}\n\ntype BeatValues = {\n beat: number;\n floor: number;\n fract: number;\n /** unique hash specific to the beat */\n hash: number;\n};\n\n/**\n * @param ease easing functions are referenced from https://github.com/ai/easings.net , default : \"easeOutQuart\"\n */\nexport const useBeat = (bpm: number, ease: EasingTypes = \"easeOutQuart\") => {\n const rhythm = bpm / 60;\n const easing = Easing[ease];\n const updateBeat = useCallback(\n (clock: THREE.Clock) => {\n let beat = clock.getElapsedTime() * rhythm;\n const floor = Math.floor(beat);\n const fract = easing(beat - floor);\n beat = fract + floor;\n const hash = getHash(floor);\n return {\n beat,\n floor,\n fract,\n hash,\n } as BeatValues;\n },\n [rhythm, easing]\n );\n return updateBeat;\n};\n","import * as THREE from \"three\";\nimport { useCallback, useMemo, useRef } from \"react\";\n\n/**\n * @param fps FPS you want to limit , default : `60`\n *\n * ```tsx\n * const limiter = useFPSLimiter(fps);\n * useFrame((props) => {\n * if (limiter(props.clock)) {\n *\t\t //some code\n * }\n * });\n * ```\n */\nexport const useFPSLimiter = (fps: number = 60) => {\n const interval = useMemo(() => 1 / Math.max(Math.min(fps, 60), 1), [fps]);\n const prevTime = useRef(null);\n\n const limiter = useCallback(\n (clock: THREE.Clock) => {\n const tick = clock.getElapsedTime();\n if (prevTime.current === null) {\n prevTime.current = tick;\n return true;\n }\n const deltaTime = tick - prevTime.current;\n if (deltaTime >= interval) {\n prevTime.current = tick;\n return true;\n }\n return false;\n },\n [interval]\n );\n\n return limiter;\n};\n","import { DomSyncerParams } from \"..\";\n\nexport const errorHandler = (params: DomSyncerParams) => {\n const domLength = params.dom?.length;\n const textureLength = params.texture?.length;\n\n if (!domLength || !textureLength) {\n return true;\n }\n\n if (domLength !== textureLength) {\n return true;\n }\n\n return false;\n};\n","varying vec2 vUv;\n\nvoid main() {\n\tvUv = uv;\n\tgl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D u_texture;\nuniform vec2 u_textureResolution;\nuniform vec2 u_resolution;\nuniform float u_borderRadius;\n\nvoid main() {\n\t// texuture color\n\tfloat screenAspect = u_resolution.x / u_resolution.y;\n\tfloat textureAspect = u_textureResolution.x / u_textureResolution.y;\n\tvec2 ratio = vec2(\n\t\tmin(screenAspect / textureAspect, 1.0),\n\t\tmin(textureAspect / screenAspect, 1.0)\n\t);\n\n\tvec2 adjustedUv = vUv * ratio + (1.0 - ratio) * 0.5;\n\tvec3 textureColor = texture2D(u_texture, adjustedUv).rgb;\n\tfloat textureAlpha = texture2D(u_texture, adjustedUv).a;\n\n\t// Based on https://mofu-dev.com/en/blog/three-dom-alignment/\n\tfloat maxSide = max(u_resolution.x, u_resolution.y);\n\tfloat minSide = min(u_resolution.x, u_resolution.y);\n\tvec2 aspect = u_resolution / maxSide;\n\tvec2 alphaUv = vUv - 0.5;\n\n\tfloat borderRadius = min(u_borderRadius, minSide * 0.5);\n\tvec2 offset = vec2(borderRadius) / u_resolution;\n\tvec2 alphaXY = smoothstep(vec2(0.5 - offset), vec2(0.5 - offset - 0.001), abs(alphaUv));\n\tfloat alpha = min(1.0, alphaXY.x + alphaXY.y);\n\n\tvec2 alphaUv2 = abs(vUv - 0.5);\n\tfloat radius = borderRadius / maxSide;\n\talphaUv2 = (alphaUv2 - 0.5) * aspect + radius;\n\tfloat roundAlpha = smoothstep(radius + 0.001, radius, length(alphaUv2));\n\n\talpha = min(1.0, alpha + roundAlpha);\n\n\t// multiply texture alpha\n\talpha *= textureAlpha;\n\n\tgl_FragColor = vec4(textureColor, alpha);\n}\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"../\";\nimport { Size } from \"@react-three/fiber\";\nimport vertexShader from \"../shader/main.vert\";\nimport fragmentShader from \"../shader/main.frag\";\nimport { MaterialProps } from \"../../../fxs/types\";\nimport { MATERIAL_BASIC_PARAMS } from \"../../../libs/constants\";\nimport { setOnBeforeCompile } from \"../../../utils/setOnBeforeCompile\";\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 uniforms,\n onBeforeCompile,\n}: {\n params: DomSyncerParams;\n size: Size;\n scene: THREE.Scene;\n} & MaterialProps) => {\n if (scene.children.length > 0) {\n scene.children.forEach((child) => {\n if (child instanceof THREE.Mesh) {\n child.geometry.dispose();\n child.material.dispose();\n }\n });\n scene.remove(...scene.children);\n }\n\n params.texture!.forEach((texture, i) => {\n const mat = new THREE.ShaderMaterial({\n uniforms: {\n u_texture: { value: texture },\n u_textureResolution: {\n value: new THREE.Vector2(0, 0),\n },\n u_resolution: { value: new THREE.Vector2(0, 0) },\n u_borderRadius: {\n value: params.boderRadius![i] ? params.boderRadius![i] : 0.0,\n },\n ...uniforms,\n },\n vertexShader: vertexShader,\n fragmentShader: fragmentShader,\n ...MATERIAL_BASIC_PARAMS,\n // Must be transparent.\n transparent: true,\n });\n\n mat.onBeforeCompile = setOnBeforeCompile(onBeforeCompile);\n\n const mesh = new THREE.Mesh(new THREE.PlaneGeometry(1, 1), mat);\n scene.add(mesh);\n });\n};\n","import { useCallback, useRef } from \"react\";\nimport { DomSyncerParams } from \"..\";\n\nexport const useIntersectionHandler = () => {\n const intersectionObserverRef = useRef([]);\n const intersectionDomRef = useRef<(HTMLElement | Element | null)[]>([]);\n\n const intersectionHandler = useCallback(\n ({\n isIntersectingRef,\n isIntersectingOnceRef,\n params,\n }: {\n isIntersectingRef: React.MutableRefObject;\n isIntersectingOnceRef: React.MutableRefObject;\n params: DomSyncerParams;\n }) => {\n if (intersectionObserverRef.current.length > 0) {\n intersectionObserverRef.current.forEach((observer, i) => {\n observer.unobserve(intersectionDomRef.current[i]!);\n });\n }\n\n intersectionDomRef.current = [];\n intersectionObserverRef.current = [];\n\n const newArr = new Array(params.dom!.length).fill(false);\n isIntersectingRef.current = [...newArr];\n isIntersectingOnceRef.current = [...newArr];\n\n params.dom!.forEach((dom, i) => {\n const callback = (entries: IntersectionObserverEntry[]) => {\n entries.forEach((entry) => {\n params.onIntersect![i] && params.onIntersect![i](entry);\n // Update the judgment after execution so that the judgment of isIntersectin can be used when executing onIntersect\n isIntersectingRef.current[i] = entry.isIntersecting;\n });\n };\n const observer = new IntersectionObserver(callback, {\n rootMargin: \"0px\",\n threshold: 0,\n });\n observer.observe(dom!);\n intersectionObserverRef.current.push(observer);\n intersectionDomRef.current.push(dom!);\n });\n },\n []\n );\n\n return intersectionHandler;\n};\n","import * as THREE from \"three\";\nimport { DomSyncerParams } from \"..\";\nimport { Size } from \"@react-three/fiber\";\nimport {\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, samples, isSizeUpdate, uniforms, onBeforeCompile }: HooksProps,\n dependencies: React.DependencyList = []\n): HooksReturn => {\n const _dpr = getDpr(dpr);\n\n const scene = useMemo(() => new THREE.Scene(), []);\n const camera = useCamera(size);\n const [renderTarget, updateRenderTarget] = useSingleFBO({\n scene,\n camera,\n size,\n dpr: _dpr.fbo,\n samples,\n isSizeUpdate,\n });\n const [params, setParams] = useParams({\n ...DOMSYNCER_PARAMS,\n updateKey: performance.now(),\n });\n\n const [DOMRects, updateDomRects] = useUpdateDomRect();\n\n // Avoid instancing vec2 every frame\n const resolutionRef = useRef(new THREE.Vector2(0, 0));\n\n // Update monitored doms according to the dependency array\n const [refreshTrigger, setRefreshTrigger] = useState(true);\n useMemo(\n () => setRefreshTrigger(true),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n dependencies\n );\n\n // If the dependencies have been updated but the key has not been updated, skip processing and return an empty texture\n const updateKey = useRef(null);\n const emptyTexture = useMemo(() => 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 uniforms,\n onBeforeCompile,\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 uniforms,\n intersectionHandler,\n onBeforeCompile,\n refreshTrigger,\n scene,\n params,\n isIntersectingOnceRef,\n isIntersectingRef,\n emptyTexture,\n updateParams,\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 { UseFboProps, renderFBO, FBO_OPTION } from \"../utils/useSingleFBO\";\n\ntype UpdateCopyFunction = (\n gl: THREE.WebGLRenderer,\n index: number,\n /** call before FBO is rendered */\n onBeforeRender?: ({ read }: { read: THREE.Texture }) => void\n) => THREE.Texture;\n\ntype UseCopyTextureReturn = [THREE.WebGLRenderTarget[], UpdateCopyFunction];\n\n/**\n * Generate an FBO array to copy the texture.\n * @param dpr If dpr is set, dpr will be multiplied, default : `false`\n * @param isSizeUpdate Whether to resize when resizing occurs. If isDpr is true, set FBO to setSize even if dpr is changed, default : `false`\n * @param length The number of FBOs to create\n * @returns [THREE.WebGLRenderTarget[] , updateCopyTexture] - Receives the RenderTarget array as the first argument and the update function as the second argument. `updateCopyTexture()` receives gl as the first argument and the index of the texture you want to copy as the second argument.\n */\nexport const useCopyTexture = (\n {\n scene,\n camera,\n size,\n dpr = false,\n isSizeUpdate = false,\n samples = 0,\n depthBuffer = false,\n depthTexture = false,\n }: UseFboProps,\n length: number\n): UseCopyTextureReturn => {\n const renderTargetArr = useRef([]);\n const resolution = useResolution(size, dpr);\n\n renderTargetArr.current = useMemo(() => {\n return Array.from({ length }, () => {\n const target = new THREE.WebGLRenderTarget(\n resolution.x,\n resolution.y,\n {\n ...FBO_OPTION,\n samples,\n depthBuffer,\n }\n );\n if (depthTexture) {\n target.depthTexture = new THREE.DepthTexture(\n resolution.x,\n resolution.y,\n THREE.FloatType\n );\n }\n return target;\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [length]);\n\n if (isSizeUpdate) {\n renderTargetArr.current.forEach((fbo) =>\n fbo.setSize(resolution.x, resolution.y)\n );\n }\n\n useEffect(() => {\n const temp = renderTargetArr.current;\n return () => {\n temp.forEach((fbo) => fbo.dispose());\n };\n }, [length]);\n\n const updateCopyTexture: UpdateCopyFunction = useCallback(\n (gl, index, onBeforeRender) => {\n const fbo = renderTargetArr.current[index];\n renderFBO({\n gl,\n scene,\n camera,\n fbo,\n onBeforeRender: () =>\n onBeforeRender && onBeforeRender({ read: fbo.texture }),\n });\n return fbo.texture;\n },\n [scene, camera]\n );\n\n return [renderTargetArr.current, updateCopyTexture];\n};\n"],"names":["main_default","useResolution","size","dpr","_width","_height","useMemo","THREE","setUniform","material","key","value","uniforms","setCustomUniform","customParams","useAddObject","scene","geometry","Proto","object3D","obj","useEffect","ISDEV","MATERIAL_BASIC_PARAMS","DEFAULT_TEXTURE","wobble3D_default","snoise_default","coverTexture_default","fxBlending_default","planeVert_default","SHADER_CHUNK","wobble3D","snoise","coverTexture","fxBlending","planeVert","includePattern","includeReplacer","match","include","string","resolveIncludes","resolveShaders","parameters","setOnBeforeCompile","onBeforeCompile","renderer","useMesh","mat","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_OPTION","renderFBO","gl","fbo","camera","onBeforeRender","onSwap","useSingleFBO","isSizeUpdate","samples","depthBuffer","depthTexture","renderTarget","target","_a","temp","updateRenderTarget","useDoubleFBO","initRenderTargets","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","iterations","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","mergeVertices","tolerance","hashToIndex","indices","vertexCount","nextIndex","attributeNames","attrArrays","morphAttrsArrays","newIndices","getters","l","name","morphAttr","decimalShift","shiftMultiplier","hash","k","newarray","newMorphArrays","getterFunc","m","ml","result","oldAttribute","buffer","BufferAttribute","oldMorphAttribute","buffer2","morphAttribute","transmission_pars_fragment_default","transmission_fragment_default","rewriteVertex","vertex","shader","baseMaterial","materialParameters","depthOnBeforeCompile","isCustomTransmission","depthMaterial","WOBBLE3D_PARAMS","transmission_pars_fragment","transmission_fragment","depthMat","useCreateWobble3D","wobbleGeometry","userData","useWobble3D","RootState","useAddMesh","Easing","x","c2","c4","c5","getHash","input","useBeat","bpm","ease","rhythm","easing","beat","floor","fract","useFPSLimiter","fps","interval","prevTime","tick","errorHandler","domLength","textureLength","createMesh","child","useIntersectionHandler","intersectionObserverRef","intersectionDomRef","isIntersectingRef","isIntersectingOnceRef","observer","newArr","dom","callback","entries","entry","useUpdateDomRect","domRects","updateDomRects","resolutionRef","domElement","rect","useIsIntersecting","isIntersecting","once","createUseDomView","onView","onHidden","isView","id","filterIntersection","item","DOMSYNCER_PARAMS","useDomSyncer","dependencies","DOMRects","refreshTrigger","setRefreshTrigger","useState","updateKey","emptyTexture","intersectionHandler","useDomView","useCopyTexture","length","renderTargetArr","updateCopyTexture"],"mappings":"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","x_google_ignoreList":[123]} \ 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 fd4e63d0..d9df3f42 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.28", + "version": "1.1.29", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@funtech-inc/use-shader-fx", - "version": "1.1.28", + "version": "1.1.29", "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 e8f05194..16b95bab 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.28", + "version": "1.1.29", "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/useWobble3D/useMaterial.ts b/packages/use-shader-fx/src/fxs/3D/useWobble3D/useMaterial.ts index 136ec6ac..088c3f9d 100644 --- a/packages/use-shader-fx/src/fxs/3D/useWobble3D/useMaterial.ts +++ b/packages/use-shader-fx/src/fxs/3D/useWobble3D/useMaterial.ts @@ -122,12 +122,12 @@ export interface WobbleMaterialProps baseMaterial?: T; materialParameters?: WobbleMaterialParams; /** - * An optional callback that is executed immediately before the depth shader program is compiled. - * @param shader — Source code of the shader + * depthMaterial's onBeforeCompile + * @param parameters — WebGL program parameters * @param renderer — WebGLRenderer Context that is initializing the material */ depthOnBeforeCompile?: ( - shader: THREE.WebGLProgramParametersWithUniforms, + parameters: THREE.WebGLProgramParametersWithUniforms, renderer: THREE.WebGLRenderer ) => void; /** @@ -187,19 +187,19 @@ export const useMaterial = ({ }, }); - mat.onBeforeCompile = (shader, renderer) => { - Object.assign(shader.uniforms, mat.userData.uniforms); + mat.onBeforeCompile = (parameters, renderer) => { + Object.assign(parameters.uniforms, mat.userData.uniforms); /******************** vert ********************/ - shader.vertexShader = rewriteVertex(shader.vertexShader); + parameters.vertexShader = rewriteVertex(parameters.vertexShader); /******************** frag ********************/ // diffuse color , Manipulate color mixing ratio with `uColorMix` - shader.fragmentShader = shader.fragmentShader.replace( + parameters.fragmentShader = parameters.fragmentShader.replace( "#include ", ` #include @@ -214,7 +214,7 @@ export const useMaterial = ({ ); // frag - shader.fragmentShader = shader.fragmentShader.replace( + parameters.fragmentShader = parameters.fragmentShader.replace( "void main() {", ` uniform vec3 uColor0; @@ -253,18 +253,18 @@ export const useMaterial = ({ // custom transmission if (mat.type === "MeshPhysicalMaterial" && isCustomTransmission) { - shader.fragmentShader = shader.fragmentShader.replace( + parameters.fragmentShader = parameters.fragmentShader.replace( "#include ", `${transmission_pars_fragment}` ); - shader.fragmentShader = shader.fragmentShader.replace( + parameters.fragmentShader = parameters.fragmentShader.replace( "#include ", `${transmission_fragment}` ); } - setOnBeforeCompile(onBeforeCompile)(shader, renderer); + setOnBeforeCompile(onBeforeCompile)(parameters, renderer); }; mat.needsUpdate = true; @@ -274,10 +274,10 @@ export const useMaterial = ({ const depthMat = new THREE.MeshDepthMaterial({ depthPacking: THREE.RGBADepthPacking, }); - depthMat.onBeforeCompile = (shader, renderer) => { - Object.assign(shader.uniforms, mat.userData.uniforms); - shader.vertexShader = rewriteVertex(shader.vertexShader); - setOnBeforeCompile(depthOnBeforeCompile)(shader, renderer); + depthMat.onBeforeCompile = (parameters, renderer) => { + Object.assign(parameters.uniforms, mat.userData.uniforms); + parameters.vertexShader = rewriteVertex(parameters.vertexShader); + setOnBeforeCompile(depthOnBeforeCompile)(parameters, renderer); }; depthMat.needsUpdate = true; diff --git a/packages/use-shader-fx/types/fxs/3D/useWobble3D/useMaterial.d.ts b/packages/use-shader-fx/types/fxs/3D/useWobble3D/useMaterial.d.ts index f19dad9e..d8bd5eca 100644 --- a/packages/use-shader-fx/types/fxs/3D/useWobble3D/useMaterial.d.ts +++ b/packages/use-shader-fx/types/fxs/3D/useWobble3D/useMaterial.d.ts @@ -73,11 +73,11 @@ export interface WobbleMaterialProps extend baseMaterial?: T; materialParameters?: WobbleMaterialParams; /** - * An optional callback that is executed immediately before the depth shader program is compiled. - * @param shader — Source code of the shader + * depthMaterial's onBeforeCompile + * @param parameters — WebGL program parameters * @param renderer — WebGLRenderer Context that is initializing the material */ - depthOnBeforeCompile?: (shader: THREE.WebGLProgramParametersWithUniforms, renderer: THREE.WebGLRenderer) => void; + depthOnBeforeCompile?: (parameters: THREE.WebGLProgramParametersWithUniforms, renderer: THREE.WebGLRenderer) => void; /** * Whether to apply more advanced `transmission` or not. valid only for `MeshPhysicalMaterial`. This is a function referring to `drei/MeshTransmissionMaterial`, default : `false` * @link https://github.com/pmndrs/drei?tab=readme-ov-file#meshtransmissionmaterial