Source: renderer/SmoothLight.js

import { noop } from "../utils/noop";

/**
 * @typedef {Object} SmoothLightRendererConfig
 * @extends {LightRendererConfig}
 * @property {number} blur
 */

/**
 * Renders smooth light effects using AGL.LightRenderer and AGL.BlurFilter
 * @class SmoothLight
 * @extends {AGL.Image}
 */

export const SmoothLight = window.AGL
  ? class SmoothLight extends AGL.Image {
      /**
       * Creates an instance of SmoothLight.
       * @constructor
       * @param {SmoothLightRendererConfig} config
       */
      constructor(config = {}) {
        super();

        this._framebuffer = new AGL.Framebuffer();

        this.lightRenderer = new AGL.LightRenderer(config);

        this._filter = new AGL.BlurFilter();

        this.filterRenderer = new AGL.FilterRenderer({
          context: this.lightRenderer.context,
          sourceTexture: this._framebuffer,
          filters: [this._filter],
        });
        this.filterRenderer.clearColor.set(0, 0, 0, 0);
        this.filterRenderer.clearBeforeRender = true;

        this.addLightForRender = this.lightRenderer.addLightForRender.bind(
          this.lightRenderer
        );

        this.blendMode = AGL.BlendMode.SHADOW;

        this._filterFramebuffer = new AGL.Framebuffer();
        this.texture = this._filterFramebuffer;

        this.blur = typeof config.blur === "number" ? config.blur : 1;
      }

      /**
       * Set/Get blur value
       * @type {number}
       */
      get blur() {
        return this._blur;
      }
      set blur(v) {
        this._blur = this._filter.intensityX = this._filter.intensityY = v;
      }

      /**
       * Render
       */
      render() {
        this._resizeFunc();
        this.lightRenderer.renderToFramebuffer(this._framebuffer);
        this.filterRenderer.renderToFramebuffer(this._filterFramebuffer);
      }

      /**
       * Set Renderer Size
       * @param {number} w
       * @param {number} h
       */
      setSize(w, h) {
        this._width = w;
        this._height = h;

        this._resizeFunc = this._resize;
      }

      /**
       * @ignore
       */
      _resize() {
        this._resizeFunc = noop;

        this.lightRenderer.setSize(this._width, this._height);
        this.filterRenderer.setSize(this._width, this._height);
      }
    }
  : null;