@pixi/core
Version:
Core PixiJS
85 lines (84 loc) • 3.38 kB
JavaScript
"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