UNPKG

@pixi/core

Version:
85 lines (84 loc) 3.38 kB
"use strict"; var extensions = require("@pixi/extensions"); class TransformFeedbackSystem { /** * @param renderer - The renderer this System works for. */ constructor(renderer) { this.renderer = renderer; } /** Sets up the renderer context and necessary buffers. */ contextChange() { this.gl = this.renderer.gl, this.CONTEXT_UID = this.renderer.CONTEXT_UID; } /** * Bind TransformFeedback and buffers * @param transformFeedback - TransformFeedback to bind */ bind(transformFeedback) { const { gl, CONTEXT_UID } = this, glTransformFeedback = transformFeedback._glTransformFeedbacks[CONTEXT_UID] || this.createGLTransformFeedback(transformFeedback); gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, glTransformFeedback); } /** Unbind TransformFeedback */ unbind() { const { gl } = this; gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, null); } /** * Begin TransformFeedback * @param drawMode - DrawMode for TransformFeedback * @param shader - A Shader used by TransformFeedback. Current bound shader will be used if not provided. */ beginTransformFeedback(drawMode, shader) { const { gl, renderer } = this; shader && renderer.shader.bind(shader), gl.beginTransformFeedback(drawMode); } /** End TransformFeedback */ endTransformFeedback() { const { gl } = this; gl.endTransformFeedback(); } /** * Create TransformFeedback and bind buffers * @param tf - TransformFeedback * @returns WebGLTransformFeedback */ createGLTransformFeedback(tf) { const { gl, renderer, CONTEXT_UID } = this, glTransformFeedback = gl.createTransformFeedback(); tf._glTransformFeedbacks[CONTEXT_UID] = glTransformFeedback, gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, glTransformFeedback); for (let i = 0; i < tf.buffers.length; i++) { const buffer = tf.buffers[i]; buffer && (renderer.buffer.update(buffer), buffer._glBuffers[CONTEXT_UID].refCount++, gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, i, buffer._glBuffers[CONTEXT_UID].buffer || null)); } return gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, null), tf.disposeRunner.add(this), glTransformFeedback; } /** * Disposes TransfromFeedback * @param {PIXI.TransformFeedback} tf - TransformFeedback * @param {boolean} [contextLost=false] - If context was lost, we suppress delete TransformFeedback */ disposeTransformFeedback(tf, contextLost) { const glTF = tf._glTransformFeedbacks[this.CONTEXT_UID], gl = this.gl; tf.disposeRunner.remove(this); const bufferSystem = this.renderer.buffer; if (bufferSystem) for (let i = 0; i < tf.buffers.length; i++) { const buffer = tf.buffers[i]; if (!buffer) continue; const buf = buffer._glBuffers[this.CONTEXT_UID]; buf && (buf.refCount--, buf.refCount === 0 && !contextLost && bufferSystem.dispose(buffer, contextLost)); } glTF && (contextLost || gl.deleteTransformFeedback(glTF), delete tf._glTransformFeedbacks[this.CONTEXT_UID]); } destroy() { this.renderer = null; } } TransformFeedbackSystem.extension = { type: extensions.ExtensionType.RendererSystem, name: "transformFeedback" }; extensions.extensions.add(TransformFeedbackSystem); exports.TransformFeedbackSystem = TransformFeedbackSystem; //# sourceMappingURL=TransformFeedbackSystem.js.map