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