UNPKG

@pixi/core

Version:
1 lines 8.7 kB
{"version":3,"file":"TransformFeedbackSystem.mjs","sources":["../../src/transformFeedback/TransformFeedbackSystem.ts"],"sourcesContent":["import { extensions, ExtensionType } from '@pixi/extensions';\n\nimport type { DRAW_MODES } from '@pixi/constants';\nimport type { ExtensionMetadata } from '@pixi/extensions';\nimport type { IRenderingContext } from '../IRenderer';\nimport type { Renderer } from '../Renderer';\nimport type { Shader } from '../shader/Shader';\nimport type { ISystem } from '../system/ISystem';\nimport type { TransformFeedback } from './TransformFeedback';\n\n/**\n * TransformFeedbackSystem provides TransformFeedback of WebGL2\n * https://developer.mozilla.org/en-US/docs/Web/API/WebGLTransformFeedback\n *\n * For example, you can use TransformFeedbackSystem to implement GPU Particle or\n * general purpose computing on GPU (aka GPGPU).\n *\n * It also manages a lifetime of GLTransformFeedback object\n * @memberof PIXI\n */\nexport class TransformFeedbackSystem implements ISystem\n{\n /** @ignore */\n static extension: ExtensionMetadata = {\n type: ExtensionType.RendererSystem,\n name: 'transformFeedback',\n };\n\n CONTEXT_UID: number;\n gl: IRenderingContext;\n\n private renderer: Renderer;\n\n /**\n * @param renderer - The renderer this System works for.\n */\n constructor(renderer: Renderer)\n {\n this.renderer = renderer;\n }\n\n /** Sets up the renderer context and necessary buffers. */\n protected contextChange(): void\n {\n this.gl = this.renderer.gl;\n\n // TODO fill out...\n this.CONTEXT_UID = this.renderer.CONTEXT_UID;\n }\n\n /**\n * Bind TransformFeedback and buffers\n * @param transformFeedback - TransformFeedback to bind\n */\n bind(transformFeedback: TransformFeedback)\n {\n const { gl, CONTEXT_UID } = this;\n\n const glTransformFeedback = transformFeedback._glTransformFeedbacks[CONTEXT_UID]\n || this.createGLTransformFeedback(transformFeedback);\n\n gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, glTransformFeedback);\n }\n\n /** Unbind TransformFeedback */\n unbind()\n {\n const { gl } = this;\n\n gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, null);\n }\n\n /**\n * Begin TransformFeedback\n * @param drawMode - DrawMode for TransformFeedback\n * @param shader - A Shader used by TransformFeedback. Current bound shader will be used if not provided.\n */\n beginTransformFeedback(drawMode: DRAW_MODES, shader?: Shader)\n {\n const { gl, renderer } = this;\n\n if (shader)\n {\n renderer.shader.bind(shader);\n }\n\n gl.beginTransformFeedback(drawMode);\n }\n\n /** End TransformFeedback */\n endTransformFeedback()\n {\n const { gl } = this;\n\n gl.endTransformFeedback();\n }\n\n /**\n * Create TransformFeedback and bind buffers\n * @param tf - TransformFeedback\n * @returns WebGLTransformFeedback\n */\n protected createGLTransformFeedback(tf: TransformFeedback)\n {\n const { gl, renderer, CONTEXT_UID } = this;\n\n const glTransformFeedback = gl.createTransformFeedback();\n\n tf._glTransformFeedbacks[CONTEXT_UID] = glTransformFeedback;\n gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, glTransformFeedback);\n for (let i = 0; i < tf.buffers.length; i++)\n {\n const buffer = tf.buffers[i];\n\n if (!buffer) continue;\n\n renderer.buffer.update(buffer);\n buffer._glBuffers[CONTEXT_UID].refCount++;\n\n gl.bindBufferBase(gl.TRANSFORM_FEEDBACK_BUFFER, i, buffer._glBuffers[CONTEXT_UID].buffer || null);\n }\n gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, null);\n\n tf.disposeRunner.add(this);\n\n return glTransformFeedback;\n }\n\n /**\n * Disposes TransfromFeedback\n * @param {PIXI.TransformFeedback} tf - TransformFeedback\n * @param {boolean} [contextLost=false] - If context was lost, we suppress delete TransformFeedback\n */\n disposeTransformFeedback(tf: TransformFeedback, contextLost?: boolean): void\n {\n const glTF = tf._glTransformFeedbacks[this.CONTEXT_UID];\n const gl = this.gl;\n\n tf.disposeRunner.remove(this);\n\n const bufferSystem = this.renderer.buffer;\n\n // bufferSystem may have already been destroyed..\n // if this is the case, there is no need to destroy the geometry buffers...\n // they already have been!\n if (bufferSystem)\n {\n for (let i = 0; i < tf.buffers.length; i++)\n {\n const buffer = tf.buffers[i];\n\n if (!buffer) continue;\n\n const buf = buffer._glBuffers[this.CONTEXT_UID];\n\n // my be null as context may have changed right before the dispose is called\n if (buf)\n {\n buf.refCount--;\n if (buf.refCount === 0 && !contextLost)\n {\n bufferSystem.dispose(buffer, contextLost);\n }\n }\n }\n }\n\n if (!glTF)\n {\n return;\n }\n\n if (!contextLost)\n {\n gl.deleteTransformFeedback(glTF);\n }\n\n delete tf._glTransformFeedbacks[this.CONTEXT_UID];\n }\n\n destroy(): void\n {\n // @TODO: Destroy managed TransformFeedbacks\n this.renderer = null;\n }\n}\n\nextensions.add(TransformFeedbackSystem);\n"],"names":[],"mappings":";;AAoBO,MAAM,uBACb,CAAA;AAAA,EAeI,YAAY,QACZ,EAAA;AACI,IAAA,IAAA,CAAK,QAAW,GAAA,QAAA,CAAA;AAAA,GACpB;AAAA,EAGA,aACA,GAAA;AACI,IAAK,IAAA,CAAA,EAAA,GAAK,KAAK,QAAS,CAAA,EAAA,CAAA;AAGxB,IAAK,IAAA,CAAA,WAAA,GAAc,KAAK,QAAS,CAAA,WAAA,CAAA;AAAA,GACrC;AAAA,EAMA,KAAK,iBACL,EAAA;AACI,IAAM,MAAA,EAAE,IAAI,WAAgB,EAAA,GAAA,IAAA,CAAA;AAE5B,IAAA,MAAM,sBAAsB,iBAAkB,CAAA,qBAAA,CAAsB,WAC/D,CAAA,IAAA,IAAA,CAAK,0BAA0B,iBAAiB,CAAA,CAAA;AAErD,IAAG,EAAA,CAAA,qBAAA,CAAsB,EAAG,CAAA,kBAAA,EAAoB,mBAAmB,CAAA,CAAA;AAAA,GACvE;AAAA,EAGA,MACA,GAAA;AACI,IAAA,MAAM,EAAE,EAAO,EAAA,GAAA,IAAA,CAAA;AAEf,IAAG,EAAA,CAAA,qBAAA,CAAsB,EAAG,CAAA,kBAAA,EAAoB,IAAI,CAAA,CAAA;AAAA,GACxD;AAAA,EAOA,sBAAA,CAAuB,UAAsB,MAC7C,EAAA;AACI,IAAM,MAAA,EAAE,IAAI,QAAa,EAAA,GAAA,IAAA,CAAA;AAEzB,IAAA,IAAI,MACJ,EAAA;AACI,MAAS,QAAA,CAAA,MAAA,CAAO,KAAK,MAAM,CAAA,CAAA;AAAA,KAC/B;AAEA,IAAA,EAAA,CAAG,uBAAuB,QAAQ,CAAA,CAAA;AAAA,GACtC;AAAA,EAGA,oBACA,GAAA;AACI,IAAA,MAAM,EAAE,EAAO,EAAA,GAAA,IAAA,CAAA;AAEf,IAAA,EAAA,CAAG,oBAAqB,EAAA,CAAA;AAAA,GAC5B;AAAA,EAOU,0BAA0B,EACpC,EAAA;AACI,IAAM,MAAA,EAAE,EAAI,EAAA,QAAA,EAAU,WAAgB,EAAA,GAAA,IAAA,CAAA;AAEtC,IAAM,MAAA,mBAAA,GAAsB,GAAG,uBAAwB,EAAA,CAAA;AAEvD,IAAA,EAAA,CAAG,sBAAsB,WAAe,CAAA,GAAA,mBAAA,CAAA;AACxC,IAAG,EAAA,CAAA,qBAAA,CAAsB,EAAG,CAAA,kBAAA,EAAoB,mBAAmB,CAAA,CAAA;AACnE,IAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,EAAG,CAAA,OAAA,CAAQ,QAAQ,CACvC,EAAA,EAAA;AACI,MAAM,MAAA,MAAA,GAAS,GAAG,OAAQ,CAAA,CAAA,CAAA,CAAA;AAE1B,MAAA,IAAI,CAAC,MAAA;AAAQ,QAAA,SAAA;AAEb,MAAS,QAAA,CAAA,MAAA,CAAO,OAAO,MAAM,CAAA,CAAA;AAC7B,MAAA,MAAA,CAAO,WAAW,WAAa,CAAA,CAAA,QAAA,EAAA,CAAA;AAE/B,MAAG,EAAA,CAAA,cAAA,CAAe,GAAG,yBAA2B,EAAA,CAAA,EAAG,OAAO,UAAW,CAAA,WAAA,CAAA,CAAa,UAAU,IAAI,CAAA,CAAA;AAAA,KACpG;AACA,IAAG,EAAA,CAAA,qBAAA,CAAsB,EAAG,CAAA,kBAAA,EAAoB,IAAI,CAAA,CAAA;AAEpD,IAAG,EAAA,CAAA,aAAA,CAAc,IAAI,IAAI,CAAA,CAAA;AAEzB,IAAO,OAAA,mBAAA,CAAA;AAAA,GACX;AAAA,EAOA,wBAAA,CAAyB,IAAuB,WAChD,EAAA;AACI,IAAM,MAAA,IAAA,GAAO,EAAG,CAAA,qBAAA,CAAsB,IAAK,CAAA,WAAA,CAAA,CAAA;AAC3C,IAAA,MAAM,KAAK,IAAK,CAAA,EAAA,CAAA;AAEhB,IAAG,EAAA,CAAA,aAAA,CAAc,OAAO,IAAI,CAAA,CAAA;AAE5B,IAAM,MAAA,YAAA,GAAe,KAAK,QAAS,CAAA,MAAA,CAAA;AAKnC,IAAA,IAAI,YACJ,EAAA;AACI,MAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,EAAG,CAAA,OAAA,CAAQ,QAAQ,CACvC,EAAA,EAAA;AACI,QAAM,MAAA,MAAA,GAAS,GAAG,OAAQ,CAAA,CAAA,CAAA,CAAA;AAE1B,QAAA,IAAI,CAAC,MAAA;AAAQ,UAAA,SAAA;AAEb,QAAM,MAAA,GAAA,GAAM,MAAO,CAAA,UAAA,CAAW,IAAK,CAAA,WAAA,CAAA,CAAA;AAGnC,QAAA,IAAI,GACJ,EAAA;AACI,UAAI,GAAA,CAAA,QAAA,EAAA,CAAA;AACJ,UAAA,IAAI,GAAI,CAAA,QAAA,KAAa,CAAK,IAAA,CAAC,WAC3B,EAAA;AACI,YAAa,YAAA,CAAA,OAAA,CAAQ,QAAQ,WAAW,CAAA,CAAA;AAAA,WAC5C;AAAA,SACJ;AAAA,OACJ;AAAA,KACJ;AAEA,IAAA,IAAI,CAAC,IACL,EAAA;AACI,MAAA,OAAA;AAAA,KACJ;AAEA,IAAA,IAAI,CAAC,WACL,EAAA;AACI,MAAA,EAAA,CAAG,wBAAwB,IAAI,CAAA,CAAA;AAAA,KACnC;AAEA,IAAO,OAAA,EAAA,CAAG,sBAAsB,IAAK,CAAA,WAAA,CAAA,CAAA;AAAA,GACzC;AAAA,EAEA,OACA,GAAA;AAEI,IAAA,IAAA,CAAK,QAAW,GAAA,IAAA,CAAA;AAAA,GACpB;AACJ,CAAA;AArKa,wBAGF,SAA+B,GAAA;AAAA,EAClC,MAAO,aAAc,CAAA,cAAA;AAAA,EACrB,IAAM,EAAA,mBAAA;AACV,CAAA,CAAA;AAiKJ,UAAA,CAAW,IAAI,uBAAuB,CAAA;;;;"}