{"version":3,"file":"util.cjs","sources":["../src/util.tsx"],"sourcesContent":["import React, { MutableRefObject } from 'react'\nimport { Vector2 } from 'three'\nimport * as THREE from 'three'\nimport { type ReactThreeFiber, extend, useThree } from '@react-three/fiber'\nimport type { Effect, BlendFunction } from 'postprocessing'\n\nexport const resolveRef = <T,>(ref: T | React.MutableRefObject<T>) =>\n  typeof ref === 'object' && ref != null && 'current' in ref ? ref.current : ref\n\nexport type EffectConstructor = new (...args: any[]) => Effect\n\nexport type EffectProps<T extends EffectConstructor> = ReactThreeFiber.Node<\n  T extends Function ? T['prototype'] : InstanceType<T>,\n  T\n> &\n  ConstructorParameters<T>[0] & {\n    blendFunction?: BlendFunction\n    opacity?: number\n  }\n\nlet i = 0\nconst components = new WeakMap<EffectConstructor, React.ExoticComponent<any> | string>()\n\nexport const wrapEffect = <T extends EffectConstructor>(effect: T, defaults?: EffectProps<T>) =>\n  /* @__PURE__ */ React.forwardRef<T, EffectProps<T>>(function Effect(\n    { blendFunction = defaults?.blendFunction, opacity = defaults?.opacity, ...props },\n    ref\n  ) {\n    let Component = components.get(effect)\n    if (!Component) {\n      const key = `@react-three/postprocessing/${effect.name}-${i++}`\n      extend({ [key]: effect })\n      components.set(effect, (Component = key))\n    }\n\n    const camera = useThree((state) => state.camera)\n    const args = React.useMemo(\n      () => [...((defaults?.args ?? []) as any[]), ...((props.args ?? [{ ...defaults, ...props }]) as any[])],\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n      [JSON.stringify(props)]\n    )\n\n    return (\n      <Component\n        camera={camera}\n        blendMode-blendFunction={blendFunction}\n        blendMode-opacity-value={opacity}\n        {...props}\n        ref={ref}\n        args={args}\n      />\n    )\n  })\n\nexport const useVector2 = (props: Record<string, unknown>, key: string): THREE.Vector2 => {\n  const value = props[key] as ReactThreeFiber.Vector2 | undefined\n  return React.useMemo(() => {\n    if (typeof value === 'number') return new THREE.Vector2(value, value)\n    else if (value) return new THREE.Vector2(...(value as THREE.Vector2Tuple))\n    else return new THREE.Vector2()\n  }, [value])\n}\n"],"names":["extend","useThree","jsx","THREE"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAMa,MAAA,aAAa,CAAK,QAC7B,OAAO,QAAQ,YAAY,OAAO,QAAQ,aAAa,MAAM,IAAI,UAAU;AAa7E,IAAI,IAAI;AACR,MAAM,iCAAiB;AAEhB,MAAM,aAAa,CAA8B,QAAW,aAC3C,sBAAA,WAA8B,SAAS,OAC3D,EAAE,gBAAgB,qCAAU,eAAe,UAAU,qCAAU,SAAS,GAAG,SAC3E,KACA;AACI,MAAA,YAAY,WAAW,IAAI,MAAM;AACrC,MAAI,CAAC,WAAW;AACR,UAAA,MAAM,+BAA+B,OAAO,QAAQ;AAC1DA,UAAAA,OAAO,EAAE,CAAC,GAAG,GAAG,OAAQ,CAAA;AACb,eAAA,IAAI,QAAS,YAAY,GAAI;AAAA,EAC1C;AAEA,QAAM,SAASC,MAAAA,SAAS,CAAC,UAAU,MAAM,MAAM;AAC/C,QAAM,OAAO,MAAM;AAAA,IACjB,MAAA;;AAAM,cAAC,IAAK,0CAAU,SAAV,YAAkB,CAAe,GAAA,IAAK,WAAM,SAAN,YAAc,CAAC,EAAE,GAAG,UAAU,GAAG,MAAO,CAAA,CAAY;AAAA;AAAA;AAAA,IAEtG,CAAC,KAAK,UAAU,KAAK,CAAC;AAAA,EAAA;AAItB,SAAAC,2BAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,2BAAyB;AAAA,MACzB,2BAAyB;AAAA,MACxB,GAAG;AAAA,MACJ;AAAA,MACA;AAAA,IAAA;AAAA,EAAA;AAGN,CAAC;AAEU,MAAA,aAAa,CAAC,OAAgC,QAA+B;AAClF,QAAA,QAAQ,MAAM,GAAG;AAChB,SAAA,MAAM,QAAQ,MAAM;AACzB,QAAI,OAAO,UAAU;AAAU,aAAO,IAAIC,iBAAM,QAAQ,OAAO,KAAK;AAAA,aAC3D;AAAO,aAAO,IAAIA,iBAAM,QAAQ,GAAI,KAA4B;AAAA;AAC7D,aAAA,IAAIA,iBAAM;EAAQ,GAC7B,CAAC,KAAK,CAAC;AACZ;;;;"}