cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
126 lines (125 loc) • 3.67 kB
JavaScript
import Base from "../core/Base.mjs";
import OrthoCamera from "../camera/Orthographic.mjs";
import PlaneGeometry from "../geometry/Plane.mjs";
import Shader from "../Shader.mjs";
import Material from "../Material.mjs";
import Mesh from "../Mesh.mjs";
import glenum from "../core/glenum.mjs";
import vertexGlsl from "../shader/source/compositor/vertex.glsl.mjs";
Shader["import"](vertexGlsl);
var planeGeo = new PlaneGeometry();
var mesh = new Mesh({
geometry: planeGeo,
frustumCulling: false
});
var camera = new OrthoCamera();
var Pass = Base.extend(
function() {
return {
fragment: "",
outputs: null,
material: null,
blendWithPrevious: false,
clearColor: false,
clearDepth: true
};
},
function() {
var shader = new Shader(Shader.source("clay.compositor.vertex"), this.fragment);
var material = new Material({
shader
});
material.enableTexturesAll();
this.material = material;
},
{
setUniform: function(name, value) {
this.material.setUniform(name, value);
},
getUniform: function(name) {
var uniform = this.material.uniforms[name];
if (uniform) {
return uniform.value;
}
},
attachOutput: function(texture, attachment) {
if (!this.outputs) {
this.outputs = {};
}
attachment = attachment || glenum.COLOR_ATTACHMENT0;
this.outputs[attachment] = texture;
},
detachOutput: function(texture) {
for (var attachment in this.outputs) {
if (this.outputs[attachment] === texture) {
this.outputs[attachment] = null;
}
}
},
bind: function(renderer, frameBuffer) {
if (this.outputs) {
for (var attachment in this.outputs) {
var texture = this.outputs[attachment];
if (texture) {
frameBuffer.attach(texture, attachment);
}
}
}
if (frameBuffer) {
frameBuffer.bind(renderer);
}
},
unbind: function(renderer, frameBuffer) {
frameBuffer.unbind(renderer);
},
render: function(renderer, frameBuffer) {
var _gl = renderer.gl;
if (frameBuffer) {
this.bind(renderer, frameBuffer);
var ext = renderer.getGLExtension("EXT_draw_buffers");
if (ext && this.outputs) {
var bufs = [];
for (var attachment in this.outputs) {
attachment = +attachment;
if (attachment >= _gl.COLOR_ATTACHMENT0 && attachment <= _gl.COLOR_ATTACHMENT0 + 8) {
bufs.push(attachment);
}
}
ext.drawBuffersEXT(bufs);
}
}
this.trigger("beforerender", this, renderer);
var clearBit = this.clearDepth ? _gl.DEPTH_BUFFER_BIT : 0;
_gl.depthMask(true);
if (this.clearColor) {
clearBit = clearBit | _gl.COLOR_BUFFER_BIT;
_gl.colorMask(true, true, true, true);
var cc = this.clearColor;
if (Array.isArray(cc)) {
_gl.clearColor(cc[0], cc[1], cc[2], cc[3]);
}
}
_gl.clear(clearBit);
if (this.blendWithPrevious) {
_gl.enable(_gl.BLEND);
this.material.transparent = true;
} else {
_gl.disable(_gl.BLEND);
this.material.transparent = false;
}
this.renderQuad(renderer);
this.trigger("afterrender", this, renderer);
if (frameBuffer) {
this.unbind(renderer, frameBuffer);
}
},
renderQuad: function(renderer) {
mesh.material = this.material;
renderer.renderPass([mesh], camera);
},
dispose: function(renderer) {
}
}
);
var Pass$1 = Pass;
export { Pass$1 as default };