UNPKG

2.82 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, '__esModule', { value: true });
4
5var extensions = require('@pixi/extensions');
6
7class TransformFeedbackSystem {
8 constructor(renderer) {
9 this.renderer = renderer;
10 }
11 contextChange() {
12 this.gl = this.renderer.gl;
13 this.CONTEXT_UID = this.renderer.CONTEXT_UID;
14 }
15 bind(transformFeedback) {
16 const { gl, CONTEXT_UID } = this;
17 const glTransformFeedback = transformFeedback._glTransformFeedbacks[CONTEXT_UID] || this.createGLTransformFeedback(transformFeedback);
18 gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, glTransformFeedback);
19 }
20 unbind() {
21 const { gl } = this;
22 gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, null);
23 }
24 beginTransformFeedback(drawMode, shader) {
25 const { gl, renderer } = this;
26 if (shader) {
27 renderer.shader.bind(shader);
28 }
29 gl.beginTransformFeedback(drawMode);
30 }
31 endTransformFeedback() {
32 const { gl } = this;
33 gl.endTransformFeedback();
34 }
35 createGLTransformFeedback(tf) {
36 const { gl, renderer, CONTEXT_UID } = this;
37 const glTransformFeedback = gl.createTransformFeedback();
38 tf._glTransformFeedbacks[CONTEXT_UID] = glTransformFeedback;
39 gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, glTransformFeedback);
40 for (let i = 0; i < tf.buffers.length; i++) {
41 const buffer = tf.buffers[i];
42 if (!buffer)
43 continue;
44 renderer.buffer.update(buffer);
45 buffer._glBuffers[CONTEXT_UID].refCount++;
46 gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, i, buffer._glBuffers[CONTEXT_UID].buffer || null);
47 }
48 gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, null);
49 tf.disposeRunner.add(this);
50 return glTransformFeedback;
51 }
52 disposeTransformFeedback(tf, contextLost) {
53 const glTF = tf._glTransformFeedbacks[this.CONTEXT_UID];
54 const gl = this.gl;
55 tf.disposeRunner.remove(this);
56 const bufferSystem = this.renderer.buffer;
57 if (bufferSystem) {
58 for (let i = 0; i < tf.buffers.length; i++) {
59 const buffer = tf.buffers[i];
60 if (!buffer)
61 continue;
62 const buf = buffer._glBuffers[this.CONTEXT_UID];
63 if (buf) {
64 buf.refCount--;
65 if (buf.refCount === 0 && !contextLost) {
66 bufferSystem.dispose(buffer, contextLost);
67 }
68 }
69 }
70 }
71 if (!glTF) {
72 return;
73 }
74 if (!contextLost) {
75 gl.deleteTransformFeedback(glTF);
76 }
77 delete tf._glTransformFeedbacks[this.CONTEXT_UID];
78 }
79 destroy() {
80 this.renderer = null;
81 }
82}
83TransformFeedbackSystem.extension = {
84 type: extensions.ExtensionType.RendererSystem,
85 name: "transformFeedback"
86};
87extensions.extensions.add(TransformFeedbackSystem);
88
89exports.TransformFeedbackSystem = TransformFeedbackSystem;
90//# sourceMappingURL=TransformFeedbackSystem.js.map