(function (global, factory) {
  if (typeof define === "function" && define.amd) {
    define(["exports", "three"], factory);
  } else if (typeof exports !== "undefined") {
    factory(exports, require("three"));
  } else {
    var mod = {
      exports: {}
    };
    factory(mod.exports, global.three);
    global.ConvolutionShader = mod.exports;
  }
})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports, _three) {
  "use strict";

  Object.defineProperty(_exports, "__esModule", {
    value: true
  });
  _exports.ConvolutionShader = void 0;

  /**
   * Convolution shader
   * ported from o3d sample to WebGL / GLSL
   * http://o3d.googlecode.com/svn/trunk/samples/convolution.html
   */
  var ConvolutionShader = {
    defines: {
      'KERNEL_SIZE_FLOAT': '25.0',
      'KERNEL_SIZE_INT': '25'
    },
    uniforms: {
      'tDiffuse': {
        value: null
      },
      'uImageIncrement': {
        value: new _three.Vector2(0.001953125, 0.0)
      },
      'cKernel': {
        value: []
      }
    },
    vertexShader:
    /* glsl */
    "\n\n\t\tuniform vec2 uImageIncrement;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv - ( ( KERNEL_SIZE_FLOAT - 1.0 ) / 2.0 ) * uImageIncrement;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}",
    fragmentShader:
    /* glsl */
    "\n\n\t\tuniform float cKernel[ KERNEL_SIZE_INT ];\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform vec2 uImageIncrement;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec2 imageCoord = vUv;\n\t\t\tvec4 sum = vec4( 0.0, 0.0, 0.0, 0.0 );\n\n\t\t\tfor( int i = 0; i < KERNEL_SIZE_INT; i ++ ) {\n\n\t\t\t\tsum += texture2D( tDiffuse, imageCoord ) * cKernel[ i ];\n\t\t\t\timageCoord += uImageIncrement;\n\n\t\t\t}\n\n\t\t\tgl_FragColor = sum;\n\n\t\t}",
    buildKernel: function buildKernel(sigma) {
      // We lop off the sqrt(2 * pi) * sigma term, since we're going to normalize anyway.
      var kMaxKernelSize = 25;
      var kernelSize = 2 * Math.ceil(sigma * 3.0) + 1;
      if (kernelSize > kMaxKernelSize) kernelSize = kMaxKernelSize;
      var halfWidth = (kernelSize - 1) * 0.5;
      var values = new Array(kernelSize);
      var sum = 0.0;

      for (var i = 0; i < kernelSize; ++i) {
        values[i] = gauss(i - halfWidth, sigma);
        sum += values[i];
      } // normalize the kernel


      for (var _i = 0; _i < kernelSize; ++_i) {
        values[_i] /= sum;
      }

      return values;
    }
  };
  _exports.ConvolutionShader = ConvolutionShader;

  function gauss(x, sigma) {
    return Math.exp(-(x * x) / (2.0 * sigma * sigma));
  }
});