Source: filters/ChromaticAberrationFilter.js

import { BaseFilter } from "./BaseFilter";

// prettier-ignore
const _GLSL = "" +
  "vec4 " +
    "pcl=vec4(" +
      "texture(uTex,vTUv-vec2(vol.x,0)).r," +
      "oCl.g," +
      "texture(uTex,vTUv+vec2(vol.x,0)).b," +
      "1" +
    ");" +

  "float " +
    "dst=vl[2]<1." +
      "?1." +
      ":clamp(distance(vec2(vl[3],vl[4]),vTUv),0.,1.)," +
    "mA=vl[5]==0.?dst:1.-dst," +
    "mB=1.-mA;" +

  "oCl=mA*pcl+mB*oCl;";

/**
 * Chromatic aberration filter
 * @extends {BaseFilter}
 */
export class ChromaticAberrationFilter extends BaseFilter {
  /**
   * Creates an instance of ChromaticAberrationFilter.
   * @constructor
   * @param {number} intensity
   * @param {number} isRadial
   * @param {number} centerX
   * @param {number} centerY
   * @param {boolean} invertRadial
   */
  constructor(
    intensity,
    isRadial = false,
    centerX = 0.5,
    centerY = 0.5,
    invertRadial = false
  ) {
    super(intensity);

    this.isRadial = isRadial;
    this.centerX = centerX;
    this.centerY = centerY;
    this.invertRadial = invertRadial;
  }

  get GLSL() {
    return _GLSL;
  }

  /**
   * Set/Get is radial
   * @type {boolean}
   */
  get isRadial() {
    return this.v[2];
  }
  set isRadial(v) {
    this.v[2] = v ? 1 : 0;
  }

  /**
   * Set/Get center x
   * @type {number}
   */
  get centerX() {
    return this.v[3];
  }
  set centerX(v) {
    this.v[3] = v;
  }

  /**
   * Set/Get center y
   * @type {number}
   */
  get centerY() {
    return this.v[4];
  }
  set centerY(v) {
    this.v[4] = v;
  }

  /**
   * Set/Get invertRadial
   * @type {boolean}
   */
  get invertRadial() {
    return this.v[5];
  }
  set invertRadial(v) {
    this.v[5] = v;
  }
}