(function (global, factory) { if (typeof define === "function" && define.amd) { define(["exports", "three", "../shaders/CopyShader.js", "./ShaderPass.js", "./MaskPass.js"], factory); } else if (typeof exports !== "undefined") { factory(exports, require("three"), require("../shaders/CopyShader.js"), require("./ShaderPass.js"), require("./MaskPass.js")); } else { var mod = { exports: {} }; factory(mod.exports, global.three, global.CopyShader, global.ShaderPass, global.MaskPass); global.EffectComposer = mod.exports; } })(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports, _three, _CopyShader, _ShaderPass, _MaskPass) { "use strict"; Object.defineProperty(_exports, "__esModule", { value: true }); _exports.Pass = _exports.FullScreenQuad = _exports.EffectComposer = void 0; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } var EffectComposer = /*#__PURE__*/function () { function EffectComposer(renderer, renderTarget) { _classCallCheck(this, EffectComposer); this.renderer = renderer; if (renderTarget === undefined) { var parameters = { minFilter: _three.LinearFilter, magFilter: _three.LinearFilter, format: _three.RGBAFormat }; var size = renderer.getSize(new _three.Vector2()); this._pixelRatio = renderer.getPixelRatio(); this._width = size.width; this._height = size.height; renderTarget = new _three.WebGLRenderTarget(this._width * this._pixelRatio, this._height * this._pixelRatio, parameters); renderTarget.texture.name = 'EffectComposer.rt1'; } else { this._pixelRatio = 1; this._width = renderTarget.width; this._height = renderTarget.height; } this.renderTarget1 = renderTarget; this.renderTarget2 = renderTarget.clone(); this.renderTarget2.texture.name = 'EffectComposer.rt2'; this.writeBuffer = this.renderTarget1; this.readBuffer = this.renderTarget2; this.renderToScreen = true; this.passes = []; // dependencies if (_CopyShader.CopyShader === undefined) { console.error('THREE.EffectComposer relies on CopyShader'); } if (_ShaderPass.ShaderPass === undefined) { console.error('THREE.EffectComposer relies on ShaderPass'); } this.copyPass = new _ShaderPass.ShaderPass(_CopyShader.CopyShader); this.clock = new _three.Clock(); } _createClass(EffectComposer, [{ key: "swapBuffers", value: function swapBuffers() { var tmp = this.readBuffer; this.readBuffer = this.writeBuffer; this.writeBuffer = tmp; } }, { key: "addPass", value: function addPass(pass) { this.passes.push(pass); pass.setSize(this._width * this._pixelRatio, this._height * this._pixelRatio); } }, { key: "insertPass", value: function insertPass(pass, index) { this.passes.splice(index, 0, pass); pass.setSize(this._width * this._pixelRatio, this._height * this._pixelRatio); } }, { key: "removePass", value: function removePass(pass) { var index = this.passes.indexOf(pass); if (index !== -1) { this.passes.splice(index, 1); } } }, { key: "isLastEnabledPass", value: function isLastEnabledPass(passIndex) { for (var i = passIndex + 1; i < this.passes.length; i++) { if (this.passes[i].enabled) { return false; } } return true; } }, { key: "render", value: function render(deltaTime) { // deltaTime value is in seconds if (deltaTime === undefined) { deltaTime = this.clock.getDelta(); } var currentRenderTarget = this.renderer.getRenderTarget(); var maskActive = false; for (var i = 0, il = this.passes.length; i < il; i++) { var pass = this.passes[i]; if (pass.enabled === false) continue; pass.renderToScreen = this.renderToScreen && this.isLastEnabledPass(i); pass.render(this.renderer, this.writeBuffer, this.readBuffer, deltaTime, maskActive); if (pass.needsSwap) { if (maskActive) { var context = this.renderer.getContext(); var stencil = this.renderer.state.buffers.stencil; //context.stencilFunc( context.NOTEQUAL, 1, 0xffffffff ); stencil.setFunc(context.NOTEQUAL, 1, 0xffffffff); this.copyPass.render(this.renderer, this.writeBuffer, this.readBuffer, deltaTime); //context.stencilFunc( context.EQUAL, 1, 0xffffffff ); stencil.setFunc(context.EQUAL, 1, 0xffffffff); } this.swapBuffers(); } if (_MaskPass.MaskPass !== undefined) { if (pass instanceof _MaskPass.MaskPass) { maskActive = true; } else if (pass instanceof _MaskPass.ClearMaskPass) { maskActive = false; } } } this.renderer.setRenderTarget(currentRenderTarget); } }, { key: "reset", value: function reset(renderTarget) { if (renderTarget === undefined) { var size = this.renderer.getSize(new _three.Vector2()); this._pixelRatio = this.renderer.getPixelRatio(); this._width = size.width; this._height = size.height; renderTarget = this.renderTarget1.clone(); renderTarget.setSize(this._width * this._pixelRatio, this._height * this._pixelRatio); } this.renderTarget1.dispose(); this.renderTarget2.dispose(); this.renderTarget1 = renderTarget; this.renderTarget2 = renderTarget.clone(); this.writeBuffer = this.renderTarget1; this.readBuffer = this.renderTarget2; } }, { key: "setSize", value: function setSize(width, height) { this._width = width; this._height = height; var effectiveWidth = this._width * this._pixelRatio; var effectiveHeight = this._height * this._pixelRatio; this.renderTarget1.setSize(effectiveWidth, effectiveHeight); this.renderTarget2.setSize(effectiveWidth, effectiveHeight); for (var i = 0; i < this.passes.length; i++) { this.passes[i].setSize(effectiveWidth, effectiveHeight); } } }, { key: "setPixelRatio", value: function setPixelRatio(pixelRatio) { this._pixelRatio = pixelRatio; this.setSize(this._width, this._height); } }]); return EffectComposer; }(); _exports.EffectComposer = EffectComposer; var Pass = /*#__PURE__*/function () { function Pass() { _classCallCheck(this, Pass); // if set to true, the pass is processed by the composer this.enabled = true; // if set to true, the pass indicates to swap read and write buffer after rendering this.needsSwap = true; // if set to true, the pass clears its buffer before rendering this.clear = false; // if set to true, the result of the pass is rendered to screen. This is set automatically by EffectComposer. this.renderToScreen = false; } _createClass(Pass, [{ key: "setSize", value: function /* width, height */ setSize() {} }, { key: "render", value: function /* renderer, writeBuffer, readBuffer, deltaTime, maskActive */ render() { console.error('THREE.Pass: .render() must be implemented in derived pass.'); } }]); return Pass; }(); // Helper for passes that need to fill the viewport with a single quad. _exports.Pass = Pass; var _camera = new _three.OrthographicCamera(-1, 1, 1, -1, 0, 1); // https://github.com/mrdoob/three.js/pull/21358 var _geometry = new _three.BufferGeometry(); _geometry.setAttribute('position', new _three.Float32BufferAttribute([-1, 3, 0, -1, -1, 0, 3, -1, 0], 3)); _geometry.setAttribute('uv', new _three.Float32BufferAttribute([0, 2, 0, 0, 2, 0], 2)); var FullScreenQuad = /*#__PURE__*/function () { function FullScreenQuad(material) { _classCallCheck(this, FullScreenQuad); this._mesh = new _three.Mesh(_geometry, material); } _createClass(FullScreenQuad, [{ key: "dispose", value: function dispose() { this._mesh.geometry.dispose(); } }, { key: "render", value: function render(renderer) { renderer.render(this._mesh, _camera); } }, { key: "material", get: function get() { return this._mesh.material; }, set: function set(value) { this._mesh.material = value; } }]); return FullScreenQuad; }(); _exports.FullScreenQuad = FullScreenQuad; });