function FXAAPass(curtains) {
      var _this37;

      var _ref15 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
          renderOrder = _ref15.renderOrder,
          depthTest = _ref15.depthTest,
          texturesOptions = _ref15.texturesOptions,
          crossOrigin = _ref15.crossOrigin,
          depth = _ref15.depth,
          clear = _ref15.clear,
          renderTarget = _ref15.renderTarget;

      _classCallCheck(this, FXAAPass);

      // taken from https://github.com/spite/Wagner/blob/master/fragment-shaders/fxaa-fs.glsl
      var fragmentShader = "\n            precision mediump float;\n            \n            varying vec3 vVertexPosition;\n            varying vec2 vTextureCoord;\n        \n            uniform sampler2D uRenderTexture;\n            \n            uniform vec2 uResolution;\n            \n            #define FXAA_REDUCE_MIN   (1.0/128.0)\n            #define FXAA_REDUCE_MUL   (1.0/8.0)\n            #define FXAA_SPAN_MAX     8.0\n            \n            void main() {\n                vec2 res = 1.0 / uResolution;\n            \n                vec3 rgbNW = texture2D(uRenderTexture, (vTextureCoord.xy + vec2(-1.0, -1.0) * res)).xyz;\n                vec3 rgbNE = texture2D(uRenderTexture, (vTextureCoord.xy + vec2(1.0, -1.0) * res)).xyz;\n                vec3 rgbSW = texture2D(uRenderTexture, (vTextureCoord.xy + vec2(-1.0, 1.0) * res)).xyz;\n                vec3 rgbSE = texture2D(uRenderTexture, (vTextureCoord.xy + vec2(1.0, 1.0) * res)).xyz;\n                vec4 rgbaM = texture2D(uRenderTexture, vTextureCoord.xy * res);\n                vec3 rgbM = rgbaM.xyz;\n                vec3 luma = vec3(0.299, 0.587, 0.114);\n            \n                float lumaNW = dot(rgbNW, luma);\n                float lumaNE = dot(rgbNE, luma);\n                float lumaSW = dot(rgbSW, luma);\n                float lumaSE = dot(rgbSE, luma);\n                float lumaM  = dot(rgbM,  luma);\n                float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE)));\n                float lumaMax = max(lumaM, max(max(lumaNW, lumaNE) , max(lumaSW, lumaSE)));\n            \n                vec2 dir;\n                dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));\n                dir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE));\n            \n                float dirReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) * (0.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN);\n            \n                float rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce);\n                dir = min(vec2(FXAA_SPAN_MAX, FXAA_SPAN_MAX),\n                      max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),\n                            dir * rcpDirMin)) * res;\n                vec4 rgbA = (1.0/2.0) * (\n                texture2D(uRenderTexture, vTextureCoord.xy + dir * (1.0/3.0 - 0.5)) +\n                texture2D(uRenderTexture, vTextureCoord.xy + dir * (2.0/3.0 - 0.5)));\n                vec4 rgbB = rgbA * (1.0/2.0) + (1.0/4.0) * (\n                texture2D(uRenderTexture, vTextureCoord.xy + dir * (0.0/3.0 - 0.5)) +\n                texture2D(uRenderTexture, vTextureCoord.xy + dir * (3.0/3.0 - 0.5)));\n                float lumaB = dot(rgbB, vec4(luma, 0.0));\n            \n                if ((lumaB < lumaMin) || (lumaB > lumaMax)) {\n                    gl_FragColor = rgbA;\n                } else {\n                    gl_FragColor = rgbB;\n                }\n            }\n        ";
      var uniforms = {
        resolution: {
          name: "uResolution",
          type: "2f",
          value: [0, 0] // will be updated after having called super()

        }
      };
      _this37 = _super6.call(this, curtains, {
        fragmentShader: fragmentShader,
        uniforms: uniforms,
        // Mesh params
        renderOrder: renderOrder,
        depthTest: depthTest,
        texturesOptions: texturesOptions,
        crossOrigin: crossOrigin,
        depth: depth,
        clear: clear,
        renderTarget: renderTarget
      }); // return if no gl context

      if (!_this37.gl) {
        return _possibleConstructorReturn(_this37);
      } // update the resolution uniform


      _this37.uniforms.resolution.value = [_this37.renderer._boundingRect.width, _this37.renderer._boundingRect.height]; // override onAfterResize callback

      _this37._onAfterResizeCallback = function () {
        // update the resolution uniform
        _this37.uniforms.resolution.value = [_this37.renderer._boundingRect.width, _this37.renderer._boundingRect.height];
        _this37._onFXAAPassAfterResizeCallback && _this37._onFXAAPassAfterResizeCallback();
      };

      return _this37;
    }
Here we create our FXAAPass object
   This is just a regular ShaderPass with preset shaders and a resolution uniform
     params: see ShaderPas class object
     returns :
   @this: our FXAAPass element
*