UNPKG

@pixi/core

Version:
87 lines (84 loc) 2.71 kB
import { ExtensionType, extensions } from '@pixi/extensions'; class TransformFeedbackSystem { constructor(renderer) { this.renderer = renderer; } contextChange() { this.gl = this.renderer.gl; this.CONTEXT_UID = this.renderer.CONTEXT_UID; } bind(transformFeedback) { const { gl, CONTEXT_UID } = this; const glTransformFeedback = transformFeedback._glTransformFeedbacks[CONTEXT_UID] || this.createGLTransformFeedback(transformFeedback); gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, glTransformFeedback); } unbind() { const { gl } = this; gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, null); } beginTransformFeedback(drawMode, shader) { const { gl, renderer } = this; if (shader) { renderer.shader.bind(shader); } gl.beginTransformFeedback(drawMode); } endTransformFeedback() { const { gl } = this; gl.endTransformFeedback(); } createGLTransformFeedback(tf) { const { gl, renderer, CONTEXT_UID } = this; const 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]; if (!buffer) continue; renderer.buffer.update(buffer); buffer._glBuffers[CONTEXT_UID].refCount++; gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, i, buffer._glBuffers[CONTEXT_UID].buffer || null); } gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, null); tf.disposeRunner.add(this); return glTransformFeedback; } disposeTransformFeedback(tf, contextLost) { const glTF = tf._glTransformFeedbacks[this.CONTEXT_UID]; const 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]; if (buf) { buf.refCount--; if (buf.refCount === 0 && !contextLost) { bufferSystem.dispose(buffer, contextLost); } } } } if (!glTF) { return; } if (!contextLost) { gl.deleteTransformFeedback(glTF); } delete tf._glTransformFeedbacks[this.CONTEXT_UID]; } destroy() { this.renderer = null; } } TransformFeedbackSystem.extension = { type: ExtensionType.RendererSystem, name: "transformFeedback" }; extensions.add(TransformFeedbackSystem); export { TransformFeedbackSystem }; //# sourceMappingURL=TransformFeedbackSystem.mjs.map