UNPKG

cione-comp-lib

Version:

`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`

126 lines (125 loc) 3.67 kB
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 };