three-stdlib
Version:
stand-alone library of threejs examples
164 lines (163 loc) • 5.91 kB
JavaScript
"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