{"version":3,"sources":["jsdelivr-header.js","/npm/@whatisjery/react-fluid-distortion@1.6.1/lib/constant.ts","/npm/@whatisjery/react-fluid-distortion@1.6.1/node_modules/.pnpm/react@19.2.0/node_modules/react/cjs/react-jsx-runtime.production.js","/npm/@whatisjery/react-fluid-distortion@1.6.1/node_modules/.pnpm/react@19.2.0/node_modules/react/cjs/react-jsx-runtime.development.js","/npm/@whatisjery/react-fluid-distortion@1.6.1/node_modules/.pnpm/react@19.2.0/node_modules/react/jsx-runtime.js","/npm/@whatisjery/react-fluid-distortion@1.6.1/lib/utils.ts","/npm/@whatisjery/react-fluid-distortion@1.6.1/lib/effect/FluidEffect.tsx","/npm/@whatisjery/react-fluid-distortion@1.6.1/lib/glsl/composite.frag","/npm/@whatisjery/react-fluid-distortion@1.6.1/lib/effect/Fluid.tsx","/npm/@whatisjery/react-fluid-distortion@1.6.1/lib/hooks/useDoubleFBO.tsx","/npm/@whatisjery/react-fluid-distortion@1.6.1/lib/glsl/base.vert","/npm/@whatisjery/react-fluid-distortion@1.6.1/lib/Fluid.tsx","/npm/@whatisjery/react-fluid-distortion@1.6.1/lib/hooks/useFBOs.tsx","/npm/@whatisjery/react-fluid-distortion@1.6.1/lib/hooks/useMaterials.tsx","/npm/@whatisjery/react-fluid-distortion@1.6.1/lib/glsl/advection.frag","/npm/@whatisjery/react-fluid-distortion@1.6.1/lib/glsl/clear.frag","/npm/@whatisjery/react-fluid-distortion@1.6.1/lib/glsl/curl.frag","/npm/@whatisjery/react-fluid-distortion@1.6.1/lib/glsl/divergence.frag","/npm/@whatisjery/react-fluid-distortion@1.6.1/lib/glsl/gradientSubstract.frag","/npm/@whatisjery/react-fluid-distortion@1.6.1/lib/glsl/pressure.frag","/npm/@whatisjery/react-fluid-distortion@1.6.1/lib/glsl/splat.frag","/npm/@whatisjery/react-fluid-distortion@1.6.1/lib/glsl/vorticity.frag","/npm/@whatisjery/react-fluid-distortion@1.6.1/lib/hooks/usePointer.tsx"],"names":[],"mappings":"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","file":"/npm/@whatisjery/react-fluid-distortion@1.6.1/dist/index.umd.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@whatisjery/react-fluid-distortion@1.6.1/dist/index.umd.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import { BlendFunction } from 'postprocessing';\n\nexport const DEFAULT_CONFIG = {\n    blend: 5,\n    intensity: 2,\n    force: 1.1,\n    distortion: 0.4,\n    curl: 1.9,\n    radius: 0.3,\n    swirl: 4,\n    pressure: 0.8,\n    densityDissipation: 0.96,\n    velocityDissipation: 1.0,\n    fluidColor: '#3300ff',\n    backgroundColor: '#070410',\n    showBackground: true,\n    rainbow: false,\n    dyeRes: 512,\n    simRes: 128,\n    blendFunction: BlendFunction.NORMAL,\n} as const;\n\nexport const REFRESH_RATE = 60;\n","/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n  REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n  var key = null;\n  void 0 !== maybeKey && (key = \"\" + maybeKey);\n  void 0 !== config.key && (key = \"\" + config.key);\n  if (\"key\" in config) {\n    maybeKey = {};\n    for (var propName in config)\n      \"key\" !== propName && (maybeKey[propName] = config[propName]);\n  } else maybeKey = config;\n  config = maybeKey.ref;\n  return {\n    $$typeof: REACT_ELEMENT_TYPE,\n    type: type,\n    key: key,\n    ref: void 0 !== config ? config : null,\n    props: maybeKey\n  };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n  (function () {\n    function getComponentNameFromType(type) {\n      if (null == type) return null;\n      if (\"function\" === typeof type)\n        return type.$$typeof === REACT_CLIENT_REFERENCE\n          ? null\n          : type.displayName || type.name || null;\n      if (\"string\" === typeof type) return type;\n      switch (type) {\n        case REACT_FRAGMENT_TYPE:\n          return \"Fragment\";\n        case REACT_PROFILER_TYPE:\n          return \"Profiler\";\n        case REACT_STRICT_MODE_TYPE:\n          return \"StrictMode\";\n        case REACT_SUSPENSE_TYPE:\n          return \"Suspense\";\n        case REACT_SUSPENSE_LIST_TYPE:\n          return \"SuspenseList\";\n        case REACT_ACTIVITY_TYPE:\n          return \"Activity\";\n      }\n      if (\"object\" === typeof type)\n        switch (\n          (\"number\" === typeof type.tag &&\n            console.error(\n              \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n            ),\n          type.$$typeof)\n        ) {\n          case REACT_PORTAL_TYPE:\n            return \"Portal\";\n          case REACT_CONTEXT_TYPE:\n            return type.displayName || \"Context\";\n          case REACT_CONSUMER_TYPE:\n            return (type._context.displayName || \"Context\") + \".Consumer\";\n          case REACT_FORWARD_REF_TYPE:\n            var innerType = type.render;\n            type = type.displayName;\n            type ||\n              ((type = innerType.displayName || innerType.name || \"\"),\n              (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n            return type;\n          case REACT_MEMO_TYPE:\n            return (\n              (innerType = type.displayName || null),\n              null !== innerType\n                ? innerType\n                : getComponentNameFromType(type.type) || \"Memo\"\n            );\n          case REACT_LAZY_TYPE:\n            innerType = type._payload;\n            type = type._init;\n            try {\n              return getComponentNameFromType(type(innerType));\n            } catch (x) {}\n        }\n      return null;\n    }\n    function testStringCoercion(value) {\n      return \"\" + value;\n    }\n    function checkKeyStringCoercion(value) {\n      try {\n        testStringCoercion(value);\n        var JSCompiler_inline_result = !1;\n      } catch (e) {\n        JSCompiler_inline_result = !0;\n      }\n      if (JSCompiler_inline_result) {\n        JSCompiler_inline_result = console;\n        var JSCompiler_temp_const = JSCompiler_inline_result.error;\n        var JSCompiler_inline_result$jscomp$0 =\n          (\"function\" === typeof Symbol &&\n            Symbol.toStringTag &&\n            value[Symbol.toStringTag]) ||\n          value.constructor.name ||\n          \"Object\";\n        JSCompiler_temp_const.call(\n          JSCompiler_inline_result,\n          \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n          JSCompiler_inline_result$jscomp$0\n        );\n        return testStringCoercion(value);\n      }\n    }\n    function getTaskName(type) {\n      if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n      if (\n        \"object\" === typeof type &&\n        null !== type &&\n        type.$$typeof === REACT_LAZY_TYPE\n      )\n        return \"<...>\";\n      try {\n        var name = getComponentNameFromType(type);\n        return name ? \"<\" + name + \">\" : \"<...>\";\n      } catch (x) {\n        return \"<...>\";\n      }\n    }\n    function getOwner() {\n      var dispatcher = ReactSharedInternals.A;\n      return null === dispatcher ? null : dispatcher.getOwner();\n    }\n    function UnknownOwner() {\n      return Error(\"react-stack-top-frame\");\n    }\n    function hasValidKey(config) {\n      if (hasOwnProperty.call(config, \"key\")) {\n        var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n        if (getter && getter.isReactWarning) return !1;\n      }\n      return void 0 !== config.key;\n    }\n    function defineKeyPropWarningGetter(props, displayName) {\n      function warnAboutAccessingKey() {\n        specialPropKeyWarningShown ||\n          ((specialPropKeyWarningShown = !0),\n          console.error(\n            \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n            displayName\n          ));\n      }\n      warnAboutAccessingKey.isReactWarning = !0;\n      Object.defineProperty(props, \"key\", {\n        get: warnAboutAccessingKey,\n        configurable: !0\n      });\n    }\n    function elementRefGetterWithDeprecationWarning() {\n      var componentName = getComponentNameFromType(this.type);\n      didWarnAboutElementRef[componentName] ||\n        ((didWarnAboutElementRef[componentName] = !0),\n        console.error(\n          \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n        ));\n      componentName = this.props.ref;\n      return void 0 !== componentName ? componentName : null;\n    }\n    function ReactElement(type, key, props, owner, debugStack, debugTask) {\n      var refProp = props.ref;\n      type = {\n        $$typeof: REACT_ELEMENT_TYPE,\n        type: type,\n        key: key,\n        props: props,\n        _owner: owner\n      };\n      null !== (void 0 !== refProp ? refProp : null)\n        ? Object.defineProperty(type, \"ref\", {\n            enumerable: !1,\n            get: elementRefGetterWithDeprecationWarning\n          })\n        : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n      type._store = {};\n      Object.defineProperty(type._store, \"validated\", {\n        configurable: !1,\n        enumerable: !1,\n        writable: !0,\n        value: 0\n      });\n      Object.defineProperty(type, \"_debugInfo\", {\n        configurable: !1,\n        enumerable: !1,\n        writable: !0,\n        value: null\n      });\n      Object.defineProperty(type, \"_debugStack\", {\n        configurable: !1,\n        enumerable: !1,\n        writable: !0,\n        value: debugStack\n      });\n      Object.defineProperty(type, \"_debugTask\", {\n        configurable: !1,\n        enumerable: !1,\n        writable: !0,\n        value: debugTask\n      });\n      Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n      return type;\n    }\n    function jsxDEVImpl(\n      type,\n      config,\n      maybeKey,\n      isStaticChildren,\n      debugStack,\n      debugTask\n    ) {\n      var children = config.children;\n      if (void 0 !== children)\n        if (isStaticChildren)\n          if (isArrayImpl(children)) {\n            for (\n              isStaticChildren = 0;\n              isStaticChildren < children.length;\n              isStaticChildren++\n            )\n              validateChildKeys(children[isStaticChildren]);\n            Object.freeze && Object.freeze(children);\n          } else\n            console.error(\n              \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n            );\n        else validateChildKeys(children);\n      if (hasOwnProperty.call(config, \"key\")) {\n        children = getComponentNameFromType(type);\n        var keys = Object.keys(config).filter(function (k) {\n          return \"key\" !== k;\n        });\n        isStaticChildren =\n          0 < keys.length\n            ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n            : \"{key: someKey}\";\n        didWarnAboutKeySpread[children + isStaticChildren] ||\n          ((keys =\n            0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n          console.error(\n            'A props object containing a \"key\" prop is being spread into JSX:\\n  let props = %s;\\n  <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n  let props = %s;\\n  <%s key={someKey} {...props} />',\n            isStaticChildren,\n            children,\n            keys,\n            children\n          ),\n          (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n      }\n      children = null;\n      void 0 !== maybeKey &&\n        (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n      hasValidKey(config) &&\n        (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n      if (\"key\" in config) {\n        maybeKey = {};\n        for (var propName in config)\n          \"key\" !== propName && (maybeKey[propName] = config[propName]);\n      } else maybeKey = config;\n      children &&\n        defineKeyPropWarningGetter(\n          maybeKey,\n          \"function\" === typeof type\n            ? type.displayName || type.name || \"Unknown\"\n            : type\n        );\n      return ReactElement(\n        type,\n        children,\n        maybeKey,\n        getOwner(),\n        debugStack,\n        debugTask\n      );\n    }\n    function validateChildKeys(node) {\n      isValidElement(node)\n        ? node._store && (node._store.validated = 1)\n        : \"object\" === typeof node &&\n          null !== node &&\n          node.$$typeof === REACT_LAZY_TYPE &&\n          (\"fulfilled\" === node._payload.status\n            ? isValidElement(node._payload.value) &&\n              node._payload.value._store &&\n              (node._payload.value._store.validated = 1)\n            : node._store && (node._store.validated = 1));\n    }\n    function isValidElement(object) {\n      return (\n        \"object\" === typeof object &&\n        null !== object &&\n        object.$$typeof === REACT_ELEMENT_TYPE\n      );\n    }\n    var React = require(\"react\"),\n      REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n      REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n      REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n      REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n      REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n      REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n      REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n      REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n      REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n      REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n      REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n      REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n      REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n      REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n      ReactSharedInternals =\n        React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n      hasOwnProperty = Object.prototype.hasOwnProperty,\n      isArrayImpl = Array.isArray,\n      createTask = console.createTask\n        ? console.createTask\n        : function () {\n            return null;\n          };\n    React = {\n      react_stack_bottom_frame: function (callStackForError) {\n        return callStackForError();\n      }\n    };\n    var specialPropKeyWarningShown;\n    var didWarnAboutElementRef = {};\n    var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n      React,\n      UnknownOwner\n    )();\n    var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n    var didWarnAboutKeySpread = {};\n    exports.Fragment = REACT_FRAGMENT_TYPE;\n    exports.jsx = function (type, config, maybeKey) {\n      var trackActualOwner =\n        1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n      return jsxDEVImpl(\n        type,\n        config,\n        maybeKey,\n        !1,\n        trackActualOwner\n          ? Error(\"react-stack-top-frame\")\n          : unknownOwnerDebugStack,\n        trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n      );\n    };\n    exports.jsxs = function (type, config, maybeKey) {\n      var trackActualOwner =\n        1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n      return jsxDEVImpl(\n        type,\n        config,\n        maybeKey,\n        !0,\n        trackActualOwner\n          ? Error(\"react-stack-top-frame\")\n          : unknownOwnerDebugStack,\n        trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n      );\n    };\n  })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n  module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","import { Color, Vector3 } from 'three';\nimport { REFRESH_RATE } from './constant';\n\nexport const hexToRgb = (hex: string) => {\n    const color = new Color(hex);\n\n    return new Vector3(color.r, color.g, color.b);\n};\n\nexport const normalizeScreenHz = (value: number, dt: number) => {\n    return Math.pow(value, dt * REFRESH_RATE);\n};\n","import { Effect, EffectAttribute } from 'postprocessing';\nimport { Texture, Uniform, Vector3 } from 'three';\nimport compositeFrag from '../glsl/composite.frag';\nimport { type EffectProps } from '../types';\nimport { hexToRgb } from '../utils';\n\ntype Uniforms = {\n    tFluid: Texture;\n    uColor: Vector3;\n    uBackgroundColor: Vector3;\n    uRainbow: boolean;\n    uShowBackground: boolean;\n    uDistort: number;\n    uBlend: number;\n    uIntensity: number;\n};\n\nexport class FluidEffect extends Effect {\n    state: EffectProps;\n\n    constructor(props: EffectProps) {\n        const uniforms: Record<keyof Uniforms, Uniform> = {\n            tFluid: new Uniform(props.tFluid),\n            uDistort: new Uniform(props.distortion),\n            uRainbow: new Uniform(props.rainbow),\n            uIntensity: new Uniform(props.intensity),\n            uBlend: new Uniform(props.blend),\n            uShowBackground: new Uniform(props.showBackground),\n            uColor: new Uniform(hexToRgb(props.fluidColor!)),\n            uBackgroundColor: new Uniform(hexToRgb(props.backgroundColor!)),\n        };\n\n        super('FluidEffect', compositeFrag, {\n            blendFunction: props.blendFunction,\n            attributes: EffectAttribute.CONVOLUTION,\n            uniforms: new Map(Object.entries(uniforms)),\n        });\n\n        this.state = props;\n    }\n\n    private updateUniform<K extends keyof Uniforms>(key: K, value: Uniforms[K]) {\n        const uniform = this.uniforms.get(key);\n        if (uniform) {\n            uniform.value = value;\n        }\n    }\n\n    update() {\n        this.updateUniform('uIntensity', this.state.intensity);\n        this.updateUniform('uDistort', this.state.distortion);\n        this.updateUniform('uRainbow', this.state.rainbow);\n        this.updateUniform('uBlend', this.state.blend);\n        this.updateUniform('uShowBackground', this.state.showBackground);\n        this.updateUniform('uColor', hexToRgb(this.state.fluidColor));\n        this.updateUniform('uBackgroundColor', hexToRgb(this.state.backgroundColor));\n    }\n}\n","uniform sampler2D tFluid;\n\nuniform vec3 uColor;\nuniform vec3 uBackgroundColor;\n\nuniform float uDistort;\nuniform float uIntensity;\nuniform float uRainbow;\nuniform float uBlend;\nuniform float uShowBackground;\n\nvoid mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {\n\n    vec3 fluidColor = texture2D(tFluid, uv).rgb;\n\n    vec2 distortedUv = uv - fluidColor.rg * uDistort * 0.001;\n\n    vec4 texture = texture2D(inputBuffer, distortedUv);\n\n    float intensity = length(fluidColor) * uIntensity * 0.0001;\n\n    vec3 selectedColor = uColor * length(fluidColor);\n\n    vec4 colorForFluidEffect = vec4(uRainbow == 1.0 ? fluidColor : selectedColor, 1.0);\n\n    vec4 computedBgColor = uShowBackground != 0.0 ? vec4(uBackgroundColor, 1.0) : vec4(0.0, 0.0, 0.0, 0.0);\n\n    outputColor = mix(texture, colorForFluidEffect, intensity);\n\n    vec4 computedFluidColor = mix(texture, colorForFluidEffect, uBlend * 0.01);\n\n    vec4 finalColor;\n\n    if(texture.a < 0.1) {\n        finalColor = mix(computedBgColor, colorForFluidEffect, intensity);\n    } else {\n        finalColor = mix(computedFluidColor, computedBgColor, 1.0 - texture.a);\n    }\n\n    outputColor = finalColor;\n}\n","import { forwardRef, useEffect, useMemo } from 'react';\nimport { EffectProps } from '../types';\nimport { FluidEffect } from './FluidEffect';\n\nexport const Effect = forwardRef(function Fluid(props: EffectProps, ref) {\n    // prevent re-creating the effect on every render\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    const effect = useMemo(() => new FluidEffect(props), []);\n\n    useEffect(() => {\n        effect.state = { ...props };\n        effect.update();\n    }, [effect, props]);\n\n    useEffect(() => {\n        return () => {\n            effect.dispose?.();\n        };\n    }, [effect]);\n\n    return <primitive ref={ref} object={effect} dispose={null} />;\n});\n","import * as THREE from 'three';\nimport { useFBO, type FboProps } from '@react-three/drei';\nimport { useRef } from 'react';\n\ntype FBO = {\n    read: THREE.WebGLRenderTarget;\n    write: THREE.WebGLRenderTarget;\n    swap: () => void;\n    dispose: () => void;\n    setGenerateMipmaps: (value: boolean) => void;\n};\n\nexport const useDoubleFBO = (width: number, height: number, options: FboProps) => {\n    const read = useFBO(width, height, options);\n\n    const write = useFBO(width, height, options);\n\n    const fbo = useRef<FBO>({\n        read,\n        write,\n        swap: () => {\n            const temp = fbo.read;\n            fbo.read = fbo.write;\n            fbo.write = temp;\n        },\n        dispose: () => {\n            read.dispose();\n            write.dispose();\n        },\n        setGenerateMipmaps: (value: boolean) => {\n            read.texture.generateMipmaps = value;\n            write.texture.generateMipmaps = value;\n        },\n    }).current;\n\n    return fbo;\n};\n","#ifdef USE_V_UV\n  varying vec2 vUv;\n#endif\n\n#ifdef USE_OFFSETS\n  varying vec2 vL;\n  varying vec2 vR;\n  varying vec2 vT;\n  varying vec2 vB;\n  uniform vec2 texelSize;\n#endif\n\nvoid main() {\n  #ifdef USE_V_UV\n    vUv = uv;\n  #endif\n\n  #ifdef USE_OFFSETS\n    vL = uv - vec2(texelSize.x, 0.0);\n    vR = uv + vec2(texelSize.x, 0.0);\n    vT = uv + vec2(0.0, texelSize.y);\n    vB = uv - vec2(0.0, texelSize.y);\n  #endif\n\n  gl_Position = vec4(position, 1.0);\n}","import { createPortal, useFrame, useThree } from '@react-three/fiber';\nimport { useCallback, useMemo, useRef, useState } from 'react';\nimport { Camera, Color, Mesh, Scene, Texture, Vector2, Vector3 } from 'three';\nimport { ShaderPass } from 'three/examples/jsm/Addons.js';\nimport { Effect as FluidEffect } from './effect/Fluid';\nimport { useFBOs } from './hooks/useFBOs';\nimport { useMaterials } from './hooks/useMaterials';\nimport { type FluidProps } from './types';\nimport { DEFAULT_CONFIG } from './constant';\nimport { usePointer } from './hooks/usePointer';\nimport { normalizeScreenHz } from './utils';\n\ntype MaterialName = keyof ReturnType<typeof useMaterials>;\ntype FBONames = keyof ReturnType<typeof useFBOs>;\n\ntype Uniforms = {\n    uColor: Vector3 | Color;\n    uPointer: Vector2;\n    uTarget: Texture | null;\n    uVelocity: Texture;\n    uCurl: Texture;\n    uTexture: Texture;\n    uPressure: Texture;\n    uDivergence: Texture;\n    uSource: Texture;\n    uRadius: number;\n    uClearValue: number;\n    uCurlValue: number;\n    uDissipation: number;\n};\n\nexport const Fluid = ({\n    blend = DEFAULT_CONFIG.blend,\n    force = DEFAULT_CONFIG.force,\n    radius = DEFAULT_CONFIG.radius,\n    curl = DEFAULT_CONFIG.curl,\n    swirl = DEFAULT_CONFIG.swirl,\n    intensity = DEFAULT_CONFIG.intensity,\n    distortion = DEFAULT_CONFIG.distortion,\n    fluidColor = DEFAULT_CONFIG.fluidColor,\n    backgroundColor = DEFAULT_CONFIG.backgroundColor,\n    showBackground = DEFAULT_CONFIG.showBackground,\n    rainbow = DEFAULT_CONFIG.rainbow,\n    pressure = DEFAULT_CONFIG.pressure,\n    densityDissipation = DEFAULT_CONFIG.densityDissipation,\n    velocityDissipation = DEFAULT_CONFIG.velocityDissipation,\n    blendFunction = DEFAULT_CONFIG.blendFunction,\n}: FluidProps) => {\n    const size = useThree((three) => three.size);\n    const gl = useThree((three) => three.gl);\n\n    const [bufferScene] = useState(() => new Scene());\n    const bufferCamera = useMemo(() => new Camera(), []);\n\n    const meshRef = useRef<Mesh>(null);\n    const postRef = useRef<ShaderPass>(null);\n    const pointerRef = useRef(new Vector2());\n    const colorRef = useRef(new Vector3());\n\n    const FBOs = useFBOs();\n    const materials = useMaterials();\n    const splatStack = usePointer({ force });\n\n    const setShaderMaterial = useCallback(\n        (name: MaterialName) => {\n            if (!meshRef.current) return;\n\n            meshRef.current.material = materials[name];\n            meshRef.current.material.needsUpdate = true;\n        },\n        [materials],\n    );\n\n    const setRenderTarget = useCallback(\n        (name: FBONames) => {\n            const target = FBOs[name];\n\n            if ('write' in target) {\n                gl.setRenderTarget(target.write);\n                gl.clear();\n                gl.render(bufferScene, bufferCamera);\n                target.swap();\n            } else {\n                gl.setRenderTarget(target);\n                gl.clear();\n                gl.render(bufferScene, bufferCamera);\n            }\n        },\n        [bufferCamera, bufferScene, FBOs, gl],\n    );\n\n    const setUniforms = useCallback(\n        <K extends keyof Uniforms>(material: MaterialName, uniform: K, value: Uniforms[K]) => {\n            const mat = materials[material];\n\n            if (mat && mat.uniforms[uniform]) {\n                mat.uniforms[uniform].value = value;\n            }\n        },\n        [materials],\n    );\n\n    useFrame((_, delta) => {\n        if (!meshRef.current || !postRef.current) return;\n\n        for (let i = splatStack.length - 1; i >= 0; i--) {\n            const { mouseX, mouseY, velocityX, velocityY } = splatStack[i];\n\n            pointerRef.current.set(mouseX, mouseY);\n            colorRef.current.set(velocityX, velocityY, 10.0);\n\n            setShaderMaterial('splat');\n            setUniforms('splat', 'uTarget', FBOs.velocity.read.texture);\n            setUniforms('splat', 'uPointer', pointerRef.current);\n            setUniforms('splat', 'uColor', colorRef.current);\n            setUniforms('splat', 'uRadius', radius / 100.0);\n            setRenderTarget('velocity');\n            setUniforms('splat', 'uTarget', FBOs.density.read.texture);\n            setRenderTarget('density');\n\n            splatStack.pop();\n        }\n\n        setShaderMaterial('curl');\n        setUniforms('curl', 'uVelocity', FBOs.velocity.read.texture);\n        setRenderTarget('curl');\n\n        setShaderMaterial('vorticity');\n        setUniforms('vorticity', 'uVelocity', FBOs.velocity.read.texture);\n        setUniforms('vorticity', 'uCurl', FBOs.curl.texture);\n        setUniforms('vorticity', 'uCurlValue', curl);\n        setRenderTarget('velocity');\n\n        setShaderMaterial('divergence');\n        setUniforms('divergence', 'uVelocity', FBOs.velocity.read.texture);\n        setRenderTarget('divergence');\n\n        setShaderMaterial('clear');\n        setUniforms('clear', 'uTexture', FBOs.pressure.read.texture);\n        setUniforms('clear', 'uClearValue', normalizeScreenHz(pressure, delta));\n        setRenderTarget('pressure');\n\n        setShaderMaterial('pressure');\n        setUniforms('pressure', 'uDivergence', FBOs.divergence.texture);\n\n        for (let i = 0; i < swirl; i++) {\n            setUniforms('pressure', 'uPressure', FBOs.pressure.read.texture);\n            setRenderTarget('pressure');\n        }\n\n        setShaderMaterial('gradientSubstract');\n        setUniforms('gradientSubstract', 'uPressure', FBOs.pressure.read.texture);\n        setUniforms('gradientSubstract', 'uVelocity', FBOs.velocity.read.texture);\n        setRenderTarget('velocity');\n\n        setShaderMaterial('advection');\n        setUniforms('advection', 'uVelocity', FBOs.velocity.read.texture);\n        setUniforms('advection', 'uSource', FBOs.velocity.read.texture);\n        setUniforms('advection', 'uDissipation', normalizeScreenHz(velocityDissipation, delta));\n\n        setRenderTarget('velocity');\n        setUniforms('advection', 'uVelocity', FBOs.velocity.read.texture);\n        setUniforms('advection', 'uSource', FBOs.density.read.texture);\n        setUniforms('advection', 'uDissipation', normalizeScreenHz(densityDissipation, delta));\n\n        setRenderTarget('density');\n    });\n\n    return (\n        <>\n            {createPortal(\n                <mesh ref={meshRef} scale={[size.width, size.height, 1]}>\n                    <planeGeometry args={[2, 2]} />\n                </mesh>,\n                bufferScene,\n            )}\n\n            <FluidEffect\n                blendFunction={blendFunction}\n                intensity={intensity}\n                rainbow={rainbow}\n                distortion={distortion}\n                backgroundColor={backgroundColor}\n                blend={blend}\n                fluidColor={fluidColor}\n                showBackground={showBackground}\n                ref={postRef}\n                tFluid={FBOs.density.read.texture}\n            />\n        </>\n    );\n};\n","import * as THREE from 'three';\n\nimport { useFBO } from '@react-three/drei';\nimport { useEffect, useMemo } from 'react';\nimport { useDoubleFBO } from '../hooks/useDoubleFBO';\nimport { DEFAULT_CONFIG } from '../constant';\n\nexport const useFBOs = () => {\n    const density = useDoubleFBO(DEFAULT_CONFIG.dyeRes, DEFAULT_CONFIG.dyeRes, {\n        type: THREE.HalfFloatType,\n        format: THREE.RGBAFormat,\n        minFilter: THREE.LinearFilter,\n        depthBuffer: false,\n    });\n\n    const velocity = useDoubleFBO(DEFAULT_CONFIG.simRes, DEFAULT_CONFIG.simRes, {\n        type: THREE.HalfFloatType,\n        format: THREE.RGFormat,\n        minFilter: THREE.LinearFilter,\n        depthBuffer: false,\n    });\n\n    const pressure = useDoubleFBO(DEFAULT_CONFIG.simRes, DEFAULT_CONFIG.simRes, {\n        type: THREE.HalfFloatType,\n        format: THREE.RedFormat,\n        minFilter: THREE.NearestFilter,\n        depthBuffer: false,\n    });\n\n    const divergence = useFBO(DEFAULT_CONFIG.simRes, DEFAULT_CONFIG.simRes, {\n        type: THREE.HalfFloatType,\n        format: THREE.RedFormat,\n        minFilter: THREE.NearestFilter,\n        depthBuffer: false,\n    });\n\n    const curl = useFBO(DEFAULT_CONFIG.simRes, DEFAULT_CONFIG.simRes, {\n        type: THREE.HalfFloatType,\n        format: THREE.RedFormat,\n        minFilter: THREE.NearestFilter,\n        depthBuffer: false,\n    });\n\n    const FBOs = useMemo(() => {\n        return {\n            density,\n            velocity,\n            pressure,\n            divergence,\n            curl,\n        };\n    }, [curl, density, divergence, pressure, velocity]);\n\n    useEffect(() => {\n        for (const FBO of Object.values(FBOs)) {\n            if ('write' in FBO) {\n                FBO.setGenerateMipmaps(false);\n            } else {\n                FBO.texture.generateMipmaps = false;\n            }\n        }\n\n        return () => {\n            for (const FBO of Object.values(FBOs)) {\n                FBO.dispose();\n            }\n        };\n    }, [FBOs]);\n\n    return FBOs;\n};\n","import { ShaderMaterial, Texture, Vector2, Vector3 } from 'three';\nimport { useEffect, useMemo } from 'react';\nimport { useThree } from '@react-three/fiber';\nimport { DEFAULT_CONFIG, REFRESH_RATE } from '../constant';\n\nimport baseVertex from '../glsl/base.vert';\nimport clearFrag from '../glsl/clear.frag';\nimport curlFrag from '../glsl/curl.frag';\nimport divergenceFrag from '../glsl/divergence.frag';\nimport gradientSubstractFrag from '../glsl/gradientSubstract.frag';\nimport pressureFrag from '../glsl/pressure.frag';\nimport splatFrag from '../glsl/splat.frag';\nimport advectionFrag from '../glsl/advection.frag';\nimport vorticityFrag from '../glsl/vorticity.frag';\n\nexport const useMaterials = (): { [key: string]: ShaderMaterial } => {\n    const size = useThree((s) => s.size);\n\n    const shaderMaterials = useMemo(() => {\n        const advection = new ShaderMaterial({\n            name: 'Fluid/Advection',\n            uniforms: {\n                uVelocity: {\n                    value: new Texture(),\n                },\n                uSource: {\n                    value: new Texture(),\n                },\n                dt: {\n                    value: 1 / REFRESH_RATE,\n                },\n                uDissipation: {\n                    value: 1.0,\n                },\n                texelSize: { value: new Vector2() },\n            },\n            fragmentShader: advectionFrag,\n            vertexShader: baseVertex,\n            defines: {\n                USE_V_UV: '',\n            },\n            depthTest: false,\n            depthWrite: false,\n        });\n\n        const clear = new ShaderMaterial({\n            name: 'Fluid/Clear',\n            uniforms: {\n                uTexture: {\n                    value: new Texture(),\n                },\n                uClearValue: {\n                    value: DEFAULT_CONFIG.pressure,\n                },\n                texelSize: {\n                    value: new Vector2(),\n                },\n            },\n            fragmentShader: clearFrag,\n            vertexShader: baseVertex,\n            defines: {\n                USE_V_UV: '',\n            },\n            depthTest: false,\n            depthWrite: false,\n        });\n\n        const curl = new ShaderMaterial({\n            name: 'Fluid/Curl',\n            uniforms: {\n                uVelocity: {\n                    value: new Texture(),\n                },\n                texelSize: {\n                    value: new Vector2(),\n                },\n            },\n            fragmentShader: curlFrag,\n            vertexShader: baseVertex,\n            defines: {\n                USE_OFFSETS: '',\n            },\n            depthTest: false,\n            depthWrite: false,\n        });\n\n        const divergence = new ShaderMaterial({\n            name: 'Fluid/Divergence',\n            uniforms: {\n                uVelocity: {\n                    value: new Texture(),\n                },\n                texelSize: {\n                    value: new Vector2(),\n                },\n            },\n            fragmentShader: divergenceFrag,\n            vertexShader: baseVertex,\n            defines: {\n                USE_V_UV: '',\n                USE_OFFSETS: '',\n            },\n            depthTest: false,\n            depthWrite: false,\n        });\n\n        const gradientSubstract = new ShaderMaterial({\n            name: 'Fluid/GradientSubtract',\n            uniforms: {\n                uPressure: {\n                    value: new Texture(),\n                },\n                uVelocity: {\n                    value: new Texture(),\n                },\n                texelSize: {\n                    value: new Vector2(),\n                },\n            },\n            fragmentShader: gradientSubstractFrag,\n            vertexShader: baseVertex,\n            defines: {\n                USE_V_UV: '',\n                USE_OFFSETS: '',\n            },\n            depthTest: false,\n            depthWrite: false,\n        });\n\n        const pressure = new ShaderMaterial({\n            name: 'Fluid/Pressure',\n            uniforms: {\n                uPressure: {\n                    value: new Texture(),\n                },\n                uDivergence: {\n                    value: new Texture(),\n                },\n                texelSize: {\n                    value: new Vector2(),\n                },\n            },\n            fragmentShader: pressureFrag,\n            vertexShader: baseVertex,\n            defines: {\n                USE_V_UV: '',\n                USE_OFFSETS: '',\n            },\n            depthTest: false,\n            depthWrite: false,\n        });\n\n        const splat = new ShaderMaterial({\n            name: 'Fluid/Splat',\n            uniforms: {\n                uTarget: {\n                    value: new Texture(),\n                },\n                aspectRatio: {\n                    value: size.width / size.height,\n                },\n                uColor: {\n                    value: new Vector3(),\n                },\n                uPointer: {\n                    value: new Vector2(),\n                },\n                uRadius: {\n                    value: DEFAULT_CONFIG.radius / 100.0,\n                },\n                texelSize: {\n                    value: new Vector2(),\n                },\n            },\n            fragmentShader: splatFrag,\n            vertexShader: baseVertex,\n            defines: {\n                USE_V_UV: '',\n            },\n            depthTest: false,\n            depthWrite: false,\n        });\n\n        const vorticity = new ShaderMaterial({\n            name: 'Fluid/Vorticity',\n            uniforms: {\n                uVelocity: {\n                    value: new Texture(),\n                },\n                uCurl: {\n                    value: new Texture(),\n                },\n                uCurlValue: {\n                    value: DEFAULT_CONFIG.curl,\n                },\n                dt: {\n                    value: 1 / REFRESH_RATE,\n                },\n                texelSize: {\n                    value: new Vector2(),\n                },\n            },\n            fragmentShader: vorticityFrag,\n            vertexShader: baseVertex,\n            defines: {\n                USE_V_UV: '',\n                USE_OFFSETS: '',\n            },\n            depthTest: false,\n            depthWrite: false,\n        });\n\n        return {\n            splat,\n            curl,\n            clear,\n            divergence,\n            pressure,\n            gradientSubstract,\n            advection,\n            vorticity,\n        };\n    }, [size]);\n\n    useEffect(() => {\n        for (const material of Object.values(shaderMaterials)) {\n            const aspectRatio = size.width / (size.height + 400);\n            material.uniforms.texelSize.value.set(\n                1 / (DEFAULT_CONFIG.simRes * aspectRatio),\n                1 / DEFAULT_CONFIG.simRes,\n            );\n        }\n\n        return () => {\n            for (const material of Object.values(shaderMaterials)) {\n                material.dispose();\n            }\n        };\n    }, [shaderMaterials, size]);\n\n    return shaderMaterials;\n};\n","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uVelocity;\nuniform sampler2D uSource;\nuniform vec2 texelSize;\nuniform float dt;\nuniform float uDissipation;\n\nvoid main() {\n    vec2 coord = vUv - dt * texture2D(uVelocity, vUv).xy * texelSize;\n\n    gl_FragColor = uDissipation * texture2D(uSource, coord);\n\n    gl_FragColor.a = 1.0;\n}","precision highp float;\n\nvarying vec2 vUv;\nuniform sampler2D uTexture;\nuniform float uClearValue;\n\nvoid main() { gl_FragColor = uClearValue * texture2D(uTexture, vUv); }\n","precision highp float;\n\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\n\nuniform sampler2D uVelocity;\n\nvoid main() {\n    float L = texture2D(uVelocity, vL).y;\n\n    float R = texture2D(uVelocity, vR).y;\n\n    float T = texture2D(uVelocity, vT).x;\n\n    float B = texture2D(uVelocity, vB).x;\n\n    float vorticity = R - L - T + B;\n\n    gl_FragColor = vec4(vorticity, 0.0, 0.0, 1.0);\n}","precision highp float;\n\nvarying highp vec2 vUv;\nvarying highp vec2 vL;\nvarying highp vec2 vR;\nvarying highp vec2 vT;\nvarying highp vec2 vB;\n\nuniform sampler2D uVelocity;\n\nvoid main() {\n    float L = texture2D(uVelocity, vL).x;\n\n    float R = texture2D(uVelocity, vR).x;\n\n    float T = texture2D(uVelocity, vT).y;\n\n    float B = texture2D(uVelocity, vB).y;\n\n    vec2 C = texture2D(uVelocity, vUv).xy;\n\n    if(vL.x < 0.0) {\n        L = -C.x;\n    }\n\n    if(vR.x > 1.0) {\n        R = -C.x;\n    }\n\n    if(vT.y > 1.0) {\n        T = -C.y;\n    }\n\n    if(vB.y < 0.0) {\n        B = -C.y;\n    }\n\n    float div = 0.5 * (R - L + T - B);\n\n    gl_FragColor = vec4(div, 0.0, 0.0, 1.0);\n}","precision highp float;\n\nvarying highp vec2 vUv;\nvarying highp vec2 vL;\nvarying highp vec2 vR;\nvarying highp vec2 vT;\nvarying highp vec2 vB;\n\nuniform sampler2D uPressure;\nuniform sampler2D uVelocity;\n\nvoid main() {\n    float L = texture2D(uPressure, vL).x;\n\n    float R = texture2D(uPressure, vR).x;\n\n    float T = texture2D(uPressure, vT).x;\n\n    float B = texture2D(uPressure, vB).x;\n\n    vec2 velocity = texture2D(uVelocity, vUv).xy;\n\n    velocity.xy -= vec2(R - L, T - B);\n\n    gl_FragColor = vec4(velocity, 0.0, 1.0);\n}","precision highp float;\n\nvarying highp vec2 vUv;\nvarying highp vec2 vL;\nvarying highp vec2 vR;\nvarying highp vec2 vT;\nvarying highp vec2 vB;\n\nuniform sampler2D uPressure;\nuniform sampler2D uDivergence;\n\nvoid main() {\n    float L = texture2D(uPressure, vL).x;\n\n    float R = texture2D(uPressure, vR).x;\n\n    float T = texture2D(uPressure, vT).x;\n\n    float B = texture2D(uPressure, vB).x;\n\n    float C = texture2D(uPressure, vUv).x;\n\n    float divergence = texture2D(uDivergence, vUv).x;\n\n    float pressure = (L + R + B + T - divergence) * 0.25;\n\n    gl_FragColor = vec4(pressure, 0.0, 0.0, 1.0);\n}\n","varying vec2 vUv;\n\nuniform sampler2D uTarget;\nuniform float aspectRatio;\nuniform vec3 uColor;\nuniform vec2 uPointer;\nuniform float uRadius;\n\nvoid main() {\n    vec2 p = vUv - uPointer.xy;\n\n    p.x *= aspectRatio;\n\n    vec3 splat = exp(-dot(p, p) / uRadius) * uColor;\n\n    vec3 base = texture2D(uTarget, vUv).xyz;\n\n    gl_FragColor = vec4(base + splat, 1.0);\n}\n","precision highp float;\n\nvarying vec2 vUv;\nvarying vec2 vL;\nvarying vec2 vR;\nvarying vec2 vT;\nvarying vec2 vB;\n\nuniform sampler2D uVelocity;\nuniform sampler2D uCurl;\nuniform float uCurlValue;\nuniform float dt;\n\nvoid main() {\n    float L = texture2D(uCurl, vL).x;\n\n    float R = texture2D(uCurl, vR).x;\n\n    float T = texture2D(uCurl, vT).x;\n\n    float B = texture2D(uCurl, vB).x;\n\n    float C = texture2D(uCurl, vUv).x;\n\n    vec2 force = vec2(abs(T) - abs(B), abs(R) - abs(L)) * 0.5;\n\n    force /= length(force) + 1.;\n\n    force *= uCurlValue * C;\n\n    force.y *= -1.;\n\n    vec2 vel = texture2D(uVelocity, vUv).xy;\n\n    gl_FragColor = vec4(vel + force * dt, 0.0, 1.0);\n}","import { useThree } from '@react-three/fiber';\nimport { useCallback, useEffect, useRef } from 'react';\n\nimport { Vector2 } from 'three';\n\ntype SplatStack = {\n    mouseX: number;\n    mouseY: number;\n    velocityX: number;\n    velocityY: number;\n};\n\nexport const usePointer = ({ force }: { force: number }) => {\n    const size = useThree((three) => three.size);\n\n    const splatStack: SplatStack[] = useRef([]).current;\n    const lastMouse = useRef<Vector2>(new Vector2());\n    const hasMoved = useRef<boolean>(false);\n\n    const onPointerMove = useCallback(\n        (event: { x: number; y: number }) => {\n            const deltaX = event.x - lastMouse.current.x;\n            const deltaY = event.y - lastMouse.current.y;\n\n            if (!hasMoved.current) {\n                hasMoved.current = true;\n                lastMouse.current.set(event.x, event.y);\n                return;\n            }\n\n            lastMouse.current.set(event.x, event.y);\n\n            const splatInfo = {\n                mouseX: event.x / size.width,\n                mouseY: 1.0 - event.y / size.height,\n                velocityX: deltaX * force,\n                velocityY: -deltaY * force,\n            };\n\n            splatStack.push(splatInfo);\n        },\n        [force, size.height, size.width, splatStack],\n    );\n\n    useEffect(() => {\n        addEventListener('pointermove', onPointerMove);\n        return () => {\n            removeEventListener('pointermove', onPointerMove);\n        };\n    }, [onPointerMove]);\n\n    return splatStack;\n};\n"]}