UNPKG

three-stdlib

Version:

stand-alone library of threejs examples

164 lines (163 loc) 5.91 kB
"use strict"; var __defProp = Object.defineProperty; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __publicField = (obj, key, value) => { __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); return value; }; Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); const THREE = require("three"); const CopyShader = require("../shaders/CopyShader.cjs"); const ShaderPass = require("./ShaderPass.cjs"); const MaskPass = require("./MaskPass.cjs"); class EffectComposer { constructor(renderer, renderTarget) { __publicField(this, "renderer"); __publicField(this, "_pixelRatio"); __publicField(this, "_width"); __publicField(this, "_height"); __publicField(this, "renderTarget1"); __publicField(this, "renderTarget2"); __publicField(this, "writeBuffer"); __publicField(this, "readBuffer"); __publicField(this, "renderToScreen"); __publicField(this, "passes", []); __publicField(this, "copyPass"); __publicField(this, "clock"); this.renderer = renderer; if (renderTarget === void 0) { const parameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBAFormat }; const 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; if (CopyShader.CopyShader === void 0) { console.error("THREE.EffectComposer relies on CopyShader"); } if (ShaderPass.ShaderPass === void 0) { console.error("THREE.EffectComposer relies on ShaderPass"); } this.copyPass = new ShaderPass.ShaderPass(CopyShader.CopyShader); this.copyPass.material.blending = THREE.NoBlending; this.clock = new THREE.Clock(); } swapBuffers() { const tmp = this.readBuffer; this.readBuffer = this.writeBuffer; this.writeBuffer = tmp; } addPass(pass) { this.passes.push(pass); pass.setSize(this._width * this._pixelRatio, this._height * this._pixelRatio); } insertPass(pass, index) { this.passes.splice(index, 0, pass); pass.setSize(this._width * this._pixelRatio, this._height * this._pixelRatio); } removePass(pass) { const index = this.passes.indexOf(pass); if (index !== -1) { this.passes.splice(index, 1); } } isLastEnabledPass(passIndex) { for (let i = passIndex + 1; i < this.passes.length; i++) { if (this.passes[i].enabled) { return false; } } return true; } render(deltaTime) { if (deltaTime === void 0) { deltaTime = this.clock.getDelta(); } const currentRenderTarget = this.renderer.getRenderTarget(); let maskActive = false; const il = this.passes.length; for (let i = 0; i < il; i++) { const 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) { const context = this.renderer.getContext(); const stencil = this.renderer.state.buffers.stencil; stencil.setFunc(context.NOTEQUAL, 1, 4294967295); this.copyPass.render(this.renderer, this.writeBuffer, this.readBuffer, deltaTime); stencil.setFunc(context.EQUAL, 1, 4294967295); } this.swapBuffers(); } if (MaskPass.MaskPass !== void 0) { if (pass instanceof MaskPass.MaskPass) { maskActive = true; } else if (pass instanceof MaskPass.ClearMaskPass) { maskActive = false; } } } this.renderer.setRenderTarget(currentRenderTarget); } reset(renderTarget) { if (renderTarget === void 0) { const 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; } setSize(width, height) { this._width = width; this._height = height; const effectiveWidth = this._width * this._pixelRatio; const effectiveHeight = this._height * this._pixelRatio; this.renderTarget1.setSize(effectiveWidth, effectiveHeight); this.renderTarget2.setSize(effectiveWidth, effectiveHeight); for (let i = 0; i < this.passes.length; i++) { this.passes[i].setSize(effectiveWidth, effectiveHeight); } } setPixelRatio(pixelRatio) { this._pixelRatio = pixelRatio; this.setSize(this._width, this._height); } dispose() { this.renderTarget1.dispose(); this.renderTarget2.dispose(); this.copyPass.dispose(); } } exports.EffectComposer = EffectComposer; //# sourceMappingURL=EffectComposer.cjs.map