{"version":3,"file":"SelectiveBloom.cjs","sources":["../../src/effects/SelectiveBloom.tsx"],"sourcesContent":["import { SelectiveBloomEffect, BlendFunction } from 'postprocessing'\nimport type { BloomEffectOptions } from 'postprocessing'\nimport React, { Ref, MutableRefObject, forwardRef, useMemo, useEffect, useContext, useRef } from 'react'\nimport { Object3D } from 'three'\nimport { useThree } from '@react-three/fiber'\nimport { EffectComposerContext } from '../EffectComposer'\nimport { selectionContext } from '../Selection'\nimport { resolveRef } from '../util'\n\ntype ObjectRef = MutableRefObject<Object3D>\n\nexport type SelectiveBloomProps = BloomEffectOptions &\n  Partial<{\n    lights: Object3D[] | ObjectRef[]\n    selection: Object3D | Object3D[] | ObjectRef | ObjectRef[]\n    selectionLayer: number\n    inverted: boolean\n    ignoreBackground: boolean\n  }>\n\nconst addLight = (light: Object3D, effect: SelectiveBloomEffect) => light.layers.enable(effect.selection.layer)\nconst removeLight = (light: Object3D, effect: SelectiveBloomEffect) => light.layers.disable(effect.selection.layer)\n\nexport const SelectiveBloom = forwardRef(function SelectiveBloom(\n  {\n    selection = [],\n    selectionLayer = 10,\n    lights = [],\n    inverted = false,\n    ignoreBackground = false,\n    luminanceThreshold,\n    luminanceSmoothing,\n    intensity,\n    width,\n    height,\n    kernelSize,\n    mipmapBlur,\n\n    ...props\n  }: SelectiveBloomProps,\n  forwardRef: Ref<SelectiveBloomEffect>\n) {\n  if (lights.length === 0) {\n    console.warn('SelectiveBloom requires lights to work.')\n  }\n\n  const invalidate = useThree((state) => state.invalidate)\n  const { scene, camera } = useContext(EffectComposerContext)\n  const effect = useMemo(() => {\n    const effect = new SelectiveBloomEffect(scene, camera, {\n      blendFunction: BlendFunction.ADD,\n      luminanceThreshold,\n      luminanceSmoothing,\n      intensity,\n      width,\n      height,\n      kernelSize,\n      mipmapBlur,\n      ...props,\n    })\n    effect.inverted = inverted\n    effect.ignoreBackground = ignoreBackground\n    return effect\n  }, [\n    scene,\n    camera,\n    luminanceThreshold,\n    luminanceSmoothing,\n    intensity,\n    width,\n    height,\n    kernelSize,\n    mipmapBlur,\n    inverted,\n    ignoreBackground,\n    props,\n  ])\n\n  const api = useContext(selectionContext)\n\n  useEffect(() => {\n    // Do not allow array selection if declarative selection is active\n    // TODO: array selection should probably be deprecated altogether\n    if (!api && selection) {\n      effect.selection.set(\n        Array.isArray(selection) ? (selection as Object3D[]).map(resolveRef) : [resolveRef(selection) as Object3D]\n      )\n      invalidate()\n      return () => {\n        effect.selection.clear()\n        invalidate()\n      }\n    }\n  }, [effect, selection, api, invalidate])\n\n  useEffect(() => {\n    effect.selection.layer = selectionLayer\n    invalidate()\n  }, [effect, invalidate, selectionLayer])\n\n  useEffect(() => {\n    if (lights && lights.length > 0) {\n      lights.forEach((light) => addLight(resolveRef(light), effect))\n      invalidate()\n      return () => {\n        lights.forEach((light) => removeLight(resolveRef(light), effect))\n        invalidate()\n      }\n    }\n  }, [effect, invalidate, lights, selectionLayer])\n\n  useEffect(() => {\n    if (api && api.enabled) {\n      if (api.selected?.length) {\n        effect.selection.set(api.selected)\n        invalidate()\n        return () => {\n          effect.selection.clear()\n          invalidate()\n        }\n      }\n    }\n  }, [api, effect.selection, invalidate])\n\n  return <primitive ref={forwardRef} object={effect} dispose={null} />\n})\n"],"names":["forwardRef","SelectiveBloom","useThree","useContext","EffectComposerContext","useMemo","effect","SelectiveBloomEffect","BlendFunction","selectionContext","useEffect","resolveRef"],"mappings":";;;;;;;;;AAoBA,MAAM,WAAW,CAAC,OAAiB,WAAiC,MAAM,OAAO,OAAO,OAAO,UAAU,KAAK;AAC9G,MAAM,cAAc,CAAC,OAAiB,WAAiC,MAAM,OAAO,QAAQ,OAAO,UAAU,KAAK;AAErG,MAAA,iBAAiBA,MAAAA,WAAW,SAASC,gBAChD;AAAA,EACE,YAAY,CAAC;AAAA,EACb,iBAAiB;AAAA,EACjB,SAAS,CAAC;AAAA,EACV,WAAW;AAAA,EACX,mBAAmB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,GAAG;AACL,GACAD,aACA;AACI,MAAA,OAAO,WAAW,GAAG;AACvB,YAAQ,KAAK,yCAAyC;AAAA,EACxD;AAEA,QAAM,aAAaE,MAAAA,SAAS,CAAC,UAAU,MAAM,UAAU;AACvD,QAAM,EAAE,OAAO,OAAO,IAAIC,iBAAWC,eAAqB,qBAAA;AACpD,QAAA,SAASC,MAAAA,QAAQ,MAAM;AAC3B,UAAMC,UAAS,IAAIC,oCAAqB,OAAO,QAAQ;AAAA,MACrD,eAAeC,eAAc,cAAA;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IAAA,CACJ;AACDF,YAAO,WAAW;AAClBA,YAAO,mBAAmB;AACnBA,WAAAA;AAAAA,EAAA,GACN;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AAEK,QAAA,MAAMH,iBAAWM,UAAAA,gBAAgB;AAEvCC,QAAAA,UAAU,MAAM;AAGV,QAAA,CAAC,OAAO,WAAW;AACrB,aAAO,UAAU;AAAA,QACf,MAAM,QAAQ,SAAS,IAAK,UAAyB,IAAIC,KAAAA,UAAU,IAAI,CAACA,gBAAW,SAAS,CAAa;AAAA,MAAA;AAEhG;AACX,aAAO,MAAM;AACX,eAAO,UAAU;AACN;MAAA;AAAA,IAEf;AAAA,KACC,CAAC,QAAQ,WAAW,KAAK,UAAU,CAAC;AAEvCD,QAAAA,UAAU,MAAM;AACd,WAAO,UAAU,QAAQ;AACd;EACV,GAAA,CAAC,QAAQ,YAAY,cAAc,CAAC;AAEvCA,QAAAA,UAAU,MAAM;AACV,QAAA,UAAU,OAAO,SAAS,GAAG;AACxB,aAAA,QAAQ,CAAC,UAAU,SAASC,KAAAA,WAAW,KAAK,GAAG,MAAM,CAAC;AAClD;AACX,aAAO,MAAM;AACJ,eAAA,QAAQ,CAAC,UAAU,YAAYA,KAAAA,WAAW,KAAK,GAAG,MAAM,CAAC;AACrD;MAAA;AAAA,IAEf;AAAA,KACC,CAAC,QAAQ,YAAY,QAAQ,cAAc,CAAC;AAE/CD,QAAAA,UAAU,MAAM;;AACV,QAAA,OAAO,IAAI,SAAS;AAClB,WAAA,SAAI,aAAJ,mBAAc,QAAQ;AACjB,eAAA,UAAU,IAAI,IAAI,QAAQ;AACtB;AACX,eAAO,MAAM;AACX,iBAAO,UAAU;AACN;QAAA;AAAA,MAEf;AAAA,IACF;AAAA,KACC,CAAC,KAAK,OAAO,WAAW,UAAU,CAAC;AAEtC,wCAAQ,aAAU,EAAA,KAAKV,aAAY,QAAQ,QAAQ,SAAS,KAAM,CAAA;AACpE,CAAC;;"}