1 | 'use strict';
|
2 |
|
3 | Object.defineProperty(exports, '__esModule', { value: true });
|
4 |
|
5 | var extensions = require('@pixi/extensions');
|
6 |
|
7 | class 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 | }
|
83 | TransformFeedbackSystem.extension = {
|
84 | type: extensions.ExtensionType.RendererSystem,
|
85 | name: "transformFeedback"
|
86 | };
|
87 | extensions.extensions.add(TransformFeedbackSystem);
|
88 |
|
89 | exports.TransformFeedbackSystem = TransformFeedbackSystem;
|
90 |
|