1 | import { ExtensionType, extensions } from '@pixi/extensions';
|
2 |
|
3 | class 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 | }
|
79 | TransformFeedbackSystem.extension = {
|
80 | type: ExtensionType.RendererSystem,
|
81 | name: "transformFeedback"
|
82 | };
|
83 | extensions.add(TransformFeedbackSystem);
|
84 |
|
85 | export { TransformFeedbackSystem };
|
86 |
|