UNPKG

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