1 line
13 KiB
Plaintext
1 line
13 KiB
Plaintext
{"version":3,"file":"GraphicsPipe.mjs","sources":["../../../../src/scene/graphics/shared/GraphicsPipe.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\nimport { State } from '../../../rendering/renderers/shared/state/State';\nimport { BigPool } from '../../../utils/pool/PoolGroup';\nimport { color32BitToUniform } from '../gpu/colorToUniform';\nimport { BatchableGraphics } from './BatchableGraphics';\n\nimport type { InstructionSet } from '../../../rendering/renderers/shared/instructions/InstructionSet';\nimport type { BatchPipe, RenderPipe } from '../../../rendering/renderers/shared/instructions/RenderPipe';\nimport type { Shader } from '../../../rendering/renderers/shared/shader/Shader';\nimport type { PoolItem } from '../../../utils/pool/Pool';\nimport type { Container } from '../../container/Container';\nimport type { Graphics } from './Graphics';\nimport type { GpuGraphicsContext, GraphicsContextSystem } from './GraphicsContextSystem';\n\nexport interface GraphicsAdaptor\n{\n shader: Shader;\n init(): void;\n execute(graphicsPipe: GraphicsPipe, renderable: Graphics): void;\n destroy(): void;\n}\nexport interface GraphicsSystem\n{\n graphicsContext: GraphicsContextSystem;\n renderPipes: {\n batch: BatchPipe\n }\n _roundPixels: 0 | 1;\n}\n\nexport class GraphicsPipe implements RenderPipe<Graphics>\n{\n /** @ignore */\n public static extension = {\n type: [\n ExtensionType.WebGLPipes,\n ExtensionType.WebGPUPipes,\n ExtensionType.CanvasPipes,\n ],\n name: 'graphics',\n } as const;\n\n public renderer: GraphicsSystem;\n public state: State = State.for2d();\n\n // batchable graphics list, used to render batches\n private _graphicsBatchesHash: Record<number, BatchableGraphics[]> = Object.create(null);\n private _adaptor: GraphicsAdaptor;\n private readonly _destroyRenderableBound = this.destroyRenderable.bind(this) as (renderable: Container) => void;\n\n constructor(renderer: GraphicsSystem, adaptor: GraphicsAdaptor)\n {\n this.renderer = renderer;\n\n this._adaptor = adaptor;\n this._adaptor.init();\n }\n\n public validateRenderable(graphics: Graphics): boolean\n {\n // assume context is dirty..\n\n const context = graphics.context;\n\n const wasBatched = !!this._graphicsBatchesHash[graphics.uid];\n\n const gpuContext = this.renderer.graphicsContext.updateGpuContext(context);\n\n if (gpuContext.isBatchable || wasBatched !== gpuContext.isBatchable)\n {\n // TODO what if they are the same size??\n return true;\n }\n\n return false;\n }\n\n public addRenderable(graphics: Graphics, instructionSet: InstructionSet)\n {\n const gpuContext = this.renderer.graphicsContext.updateGpuContext(graphics.context);\n\n // need to get batches here.. as we need to know if we can batch or not..\n // this also overrides the current batches..\n\n if (graphics._didGraphicsUpdate)\n {\n graphics._didGraphicsUpdate = false;\n\n this._rebuild(graphics);\n }\n\n if (gpuContext.isBatchable)\n {\n this._addToBatcher(graphics, instructionSet);\n }\n else\n {\n this.renderer.renderPipes.batch.break(instructionSet);\n instructionSet.add(graphics);\n }\n }\n\n public updateRenderable(graphics: Graphics)\n {\n const batches = this._graphicsBatchesHash[graphics.uid];\n\n if (batches)\n {\n for (let i = 0; i < batches.length; i++)\n {\n const batch = batches[i];\n\n batch._batcher.updateElement(batch);\n }\n }\n }\n\n public destroyRenderable(graphics: Graphics)\n {\n if (this._graphicsBatchesHash[graphics.uid])\n {\n this._removeBatchForRenderable(graphics.uid);\n }\n\n graphics.off('destroyed', this._destroyRenderableBound);\n }\n\n public execute(graphics: Graphics)\n {\n if (!graphics.isRenderable) return;\n\n const renderer = this.renderer;\n const context = graphics.context;\n const contextSystem = renderer.graphicsContext;\n\n // early out if there is no actual visual stuff...\n if (!contextSystem.getGpuContext(context).batches.length)\n { return; }\n\n const shader = context.customShader || this._adaptor.shader;\n\n this.state.blendMode = graphics.groupBlendMode;\n\n const localUniforms = shader.resources.localUniforms.uniforms;\n\n localUniforms.uTransformMatrix = graphics.groupTransform;\n localUniforms.uRound = renderer._roundPixels | graphics._roundPixels;\n\n color32BitToUniform(\n graphics.groupColorAlpha,\n localUniforms.uColor,\n 0,\n );\n\n this._adaptor.execute(this, graphics);\n }\n\n private _rebuild(graphics: Graphics)\n {\n const wasBatched = !!this._graphicsBatchesHash[graphics.uid];\n\n const gpuContext = this.renderer.graphicsContext.updateGpuContext(graphics.context);\n\n // TODO POOL the old batches!\n\n if (wasBatched)\n {\n this._removeBatchForRenderable(graphics.uid);\n }\n\n if (gpuContext.isBatchable)\n {\n this._initBatchesForRenderable(graphics);\n }\n\n graphics.batched = gpuContext.isBatchable;\n }\n\n private _addToBatcher(graphics: Graphics, instructionSet: InstructionSet)\n {\n const batchPipe = this.renderer.renderPipes.batch;\n\n const batches = this._getBatchesForRenderable(graphics);\n\n for (let i = 0; i < batches.length; i++)\n {\n const batch = batches[i];\n\n batchPipe.addToBatch(batch, instructionSet);\n }\n }\n\n private _getBatchesForRenderable(graphics: Graphics): BatchableGraphics[]\n {\n return this._graphicsBatchesHash[graphics.uid] || this._initBatchesForRenderable(graphics);\n }\n\n private _initBatchesForRenderable(graphics: Graphics): BatchableGraphics[]\n {\n const context = graphics.context;\n\n const gpuContext: GpuGraphicsContext = this.renderer.graphicsContext.getGpuContext(context);\n\n const roundPixels = (this.renderer._roundPixels | graphics._roundPixels) as 0 | 1;\n\n const batches = gpuContext.batches.map((batch) =>\n {\n const batchClone = BigPool.get(BatchableGraphics);\n\n batch.copyTo(batchClone);\n\n batchClone.renderable = graphics;\n\n batchClone.roundPixels = roundPixels;\n\n return batchClone;\n });\n\n if (this._graphicsBatchesHash[graphics.uid] === undefined)\n {\n // TODO perhaps manage this outside this pipe? (a bit like how we update / add)\n graphics.on('destroyed', this._destroyRenderableBound);\n }\n\n this._graphicsBatchesHash[graphics.uid] = batches;\n\n return batches;\n }\n\n private _removeBatchForRenderable(graphicsUid: number)\n {\n this._graphicsBatchesHash[graphicsUid].forEach((batch) =>\n {\n BigPool.return(batch as PoolItem);\n });\n\n this._graphicsBatchesHash[graphicsUid] = null;\n }\n\n public destroy()\n {\n this.renderer = null;\n\n this._adaptor.destroy();\n this._adaptor = null;\n this.state = null;\n\n for (const i in this._graphicsBatchesHash)\n {\n this._removeBatchForRenderable(i as unknown as number);\n }\n\n this._graphicsBatchesHash = null;\n }\n}\n"],"names":[],"mappings":";;;;;;;AA8BO,MAAM,YACb,CAAA;AAAA,EAmBI,WAAA,CAAY,UAA0B,OACtC,EAAA;AARA,IAAO,IAAA,CAAA,KAAA,GAAe,MAAM,KAAM,EAAA,CAAA;AAGlC;AAAA,IAAQ,IAAA,CAAA,oBAAA,mBAAmE,MAAA,CAAA,MAAA,CAAO,IAAI,CAAA,CAAA;AAEtF,IAAA,IAAA,CAAiB,uBAA0B,GAAA,IAAA,CAAK,iBAAkB,CAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAIvE,IAAA,IAAA,CAAK,QAAW,GAAA,QAAA,CAAA;AAEhB,IAAA,IAAA,CAAK,QAAW,GAAA,OAAA,CAAA;AAChB,IAAA,IAAA,CAAK,SAAS,IAAK,EAAA,CAAA;AAAA,GACvB;AAAA,EAEO,mBAAmB,QAC1B,EAAA;AAGI,IAAA,MAAM,UAAU,QAAS,CAAA,OAAA,CAAA;AAEzB,IAAA,MAAM,aAAa,CAAC,CAAC,IAAK,CAAA,oBAAA,CAAqB,SAAS,GAAG,CAAA,CAAA;AAE3D,IAAA,MAAM,UAAa,GAAA,IAAA,CAAK,QAAS,CAAA,eAAA,CAAgB,iBAAiB,OAAO,CAAA,CAAA;AAEzE,IAAA,IAAI,UAAW,CAAA,WAAA,IAAe,UAAe,KAAA,UAAA,CAAW,WACxD,EAAA;AAEI,MAAO,OAAA,IAAA,CAAA;AAAA,KACX;AAEA,IAAO,OAAA,KAAA,CAAA;AAAA,GACX;AAAA,EAEO,aAAA,CAAc,UAAoB,cACzC,EAAA;AACI,IAAA,MAAM,aAAa,IAAK,CAAA,QAAA,CAAS,eAAgB,CAAA,gBAAA,CAAiB,SAAS,OAAO,CAAA,CAAA;AAKlF,IAAA,IAAI,SAAS,kBACb,EAAA;AACI,MAAA,QAAA,CAAS,kBAAqB,GAAA,KAAA,CAAA;AAE9B,MAAA,IAAA,CAAK,SAAS,QAAQ,CAAA,CAAA;AAAA,KAC1B;AAEA,IAAA,IAAI,WAAW,WACf,EAAA;AACI,MAAK,IAAA,CAAA,aAAA,CAAc,UAAU,cAAc,CAAA,CAAA;AAAA,KAG/C,MAAA;AACI,MAAA,IAAA,CAAK,QAAS,CAAA,WAAA,CAAY,KAAM,CAAA,KAAA,CAAM,cAAc,CAAA,CAAA;AACpD,MAAA,cAAA,CAAe,IAAI,QAAQ,CAAA,CAAA;AAAA,KAC/B;AAAA,GACJ;AAAA,EAEO,iBAAiB,QACxB,EAAA;AACI,IAAA,MAAM,OAAU,GAAA,IAAA,CAAK,oBAAqB,CAAA,QAAA,CAAS,GAAG,CAAA,CAAA;AAEtD,IAAA,IAAI,OACJ,EAAA;AACI,MAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,OAAA,CAAQ,QAAQ,CACpC,EAAA,EAAA;AACI,QAAM,MAAA,KAAA,GAAQ,QAAQ,CAAC,CAAA,CAAA;AAEvB,QAAM,KAAA,CAAA,QAAA,CAAS,cAAc,KAAK,CAAA,CAAA;AAAA,OACtC;AAAA,KACJ;AAAA,GACJ;AAAA,EAEO,kBAAkB,QACzB,EAAA;AACI,IAAA,IAAI,IAAK,CAAA,oBAAA,CAAqB,QAAS,CAAA,GAAG,CAC1C,EAAA;AACI,MAAK,IAAA,CAAA,yBAAA,CAA0B,SAAS,GAAG,CAAA,CAAA;AAAA,KAC/C;AAEA,IAAS,QAAA,CAAA,GAAA,CAAI,WAAa,EAAA,IAAA,CAAK,uBAAuB,CAAA,CAAA;AAAA,GAC1D;AAAA,EAEO,QAAQ,QACf,EAAA;AACI,IAAA,IAAI,CAAC,QAAS,CAAA,YAAA;AAAc,MAAA,OAAA;AAE5B,IAAA,MAAM,WAAW,IAAK,CAAA,QAAA,CAAA;AACtB,IAAA,MAAM,UAAU,QAAS,CAAA,OAAA,CAAA;AACzB,IAAA,MAAM,gBAAgB,QAAS,CAAA,eAAA,CAAA;AAG/B,IAAA,IAAI,CAAC,aAAc,CAAA,aAAA,CAAc,OAAO,CAAA,CAAE,QAAQ,MAClD,EAAA;AAAE,MAAA,OAAA;AAAA,KAAQ;AAEV,IAAA,MAAM,MAAS,GAAA,OAAA,CAAQ,YAAgB,IAAA,IAAA,CAAK,QAAS,CAAA,MAAA,CAAA;AAErD,IAAK,IAAA,CAAA,KAAA,CAAM,YAAY,QAAS,CAAA,cAAA,CAAA;AAEhC,IAAM,MAAA,aAAA,GAAgB,MAAO,CAAA,SAAA,CAAU,aAAc,CAAA,QAAA,CAAA;AAErD,IAAA,aAAA,CAAc,mBAAmB,QAAS,CAAA,cAAA,CAAA;AAC1C,IAAc,aAAA,CAAA,MAAA,GAAS,QAAS,CAAA,YAAA,GAAe,QAAS,CAAA,YAAA,CAAA;AAExD,IAAA,mBAAA;AAAA,MACI,QAAS,CAAA,eAAA;AAAA,MACT,aAAc,CAAA,MAAA;AAAA,MACd,CAAA;AAAA,KACJ,CAAA;AAEA,IAAK,IAAA,CAAA,QAAA,CAAS,OAAQ,CAAA,IAAA,EAAM,QAAQ,CAAA,CAAA;AAAA,GACxC;AAAA,EAEQ,SAAS,QACjB,EAAA;AACI,IAAA,MAAM,aAAa,CAAC,CAAC,IAAK,CAAA,oBAAA,CAAqB,SAAS,GAAG,CAAA,CAAA;AAE3D,IAAA,MAAM,aAAa,IAAK,CAAA,QAAA,CAAS,eAAgB,CAAA,gBAAA,CAAiB,SAAS,OAAO,CAAA,CAAA;AAIlF,IAAA,IAAI,UACJ,EAAA;AACI,MAAK,IAAA,CAAA,yBAAA,CAA0B,SAAS,GAAG,CAAA,CAAA;AAAA,KAC/C;AAEA,IAAA,IAAI,WAAW,WACf,EAAA;AACI,MAAA,IAAA,CAAK,0BAA0B,QAAQ,CAAA,CAAA;AAAA,KAC3C;AAEA,IAAA,QAAA,CAAS,UAAU,UAAW,CAAA,WAAA,CAAA;AAAA,GAClC;AAAA,EAEQ,aAAA,CAAc,UAAoB,cAC1C,EAAA;AACI,IAAM,MAAA,SAAA,GAAY,IAAK,CAAA,QAAA,CAAS,WAAY,CAAA,KAAA,CAAA;AAE5C,IAAM,MAAA,OAAA,GAAU,IAAK,CAAA,wBAAA,CAAyB,QAAQ,CAAA,CAAA;AAEtD,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,OAAA,CAAQ,QAAQ,CACpC,EAAA,EAAA;AACI,MAAM,MAAA,KAAA,GAAQ,QAAQ,CAAC,CAAA,CAAA;AAEvB,MAAU,SAAA,CAAA,UAAA,CAAW,OAAO,cAAc,CAAA,CAAA;AAAA,KAC9C;AAAA,GACJ;AAAA,EAEQ,yBAAyB,QACjC,EAAA;AACI,IAAA,OAAO,KAAK,oBAAqB,CAAA,QAAA,CAAS,GAAG,CAAK,IAAA,IAAA,CAAK,0BAA0B,QAAQ,CAAA,CAAA;AAAA,GAC7F;AAAA,EAEQ,0BAA0B,QAClC,EAAA;AACI,IAAA,MAAM,UAAU,QAAS,CAAA,OAAA,CAAA;AAEzB,IAAA,MAAM,UAAiC,GAAA,IAAA,CAAK,QAAS,CAAA,eAAA,CAAgB,cAAc,OAAO,CAAA,CAAA;AAE1F,IAAA,MAAM,WAAe,GAAA,IAAA,CAAK,QAAS,CAAA,YAAA,GAAe,QAAS,CAAA,YAAA,CAAA;AAE3D,IAAA,MAAM,OAAU,GAAA,UAAA,CAAW,OAAQ,CAAA,GAAA,CAAI,CAAC,KACxC,KAAA;AACI,MAAM,MAAA,UAAA,GAAa,OAAQ,CAAA,GAAA,CAAI,iBAAiB,CAAA,CAAA;AAEhD,MAAA,KAAA,CAAM,OAAO,UAAU,CAAA,CAAA;AAEvB,MAAA,UAAA,CAAW,UAAa,GAAA,QAAA,CAAA;AAExB,MAAA,UAAA,CAAW,WAAc,GAAA,WAAA,CAAA;AAEzB,MAAO,OAAA,UAAA,CAAA;AAAA,KACV,CAAA,CAAA;AAED,IAAA,IAAI,IAAK,CAAA,oBAAA,CAAqB,QAAS,CAAA,GAAG,MAAM,KAChD,CAAA,EAAA;AAEI,MAAS,QAAA,CAAA,EAAA,CAAG,WAAa,EAAA,IAAA,CAAK,uBAAuB,CAAA,CAAA;AAAA,KACzD;AAEA,IAAK,IAAA,CAAA,oBAAA,CAAqB,QAAS,CAAA,GAAG,CAAI,GAAA,OAAA,CAAA;AAE1C,IAAO,OAAA,OAAA,CAAA;AAAA,GACX;AAAA,EAEQ,0BAA0B,WAClC,EAAA;AACI,IAAA,IAAA,CAAK,oBAAqB,CAAA,WAAW,CAAE,CAAA,OAAA,CAAQ,CAAC,KAChD,KAAA;AACI,MAAA,OAAA,CAAQ,OAAO,KAAiB,CAAA,CAAA;AAAA,KACnC,CAAA,CAAA;AAED,IAAK,IAAA,CAAA,oBAAA,CAAqB,WAAW,CAAI,GAAA,IAAA,CAAA;AAAA,GAC7C;AAAA,EAEO,OACP,GAAA;AACI,IAAA,IAAA,CAAK,QAAW,GAAA,IAAA,CAAA;AAEhB,IAAA,IAAA,CAAK,SAAS,OAAQ,EAAA,CAAA;AACtB,IAAA,IAAA,CAAK,QAAW,GAAA,IAAA,CAAA;AAChB,IAAA,IAAA,CAAK,KAAQ,GAAA,IAAA,CAAA;AAEb,IAAW,KAAA,MAAA,CAAA,IAAK,KAAK,oBACrB,EAAA;AACI,MAAA,IAAA,CAAK,0BAA0B,CAAsB,CAAA,CAAA;AAAA,KACzD;AAEA,IAAA,IAAA,CAAK,oBAAuB,GAAA,IAAA,CAAA;AAAA,GAChC;AACJ,CAAA;AAAA;AAhOa,YAAA,CAGK,SAAY,GAAA;AAAA,EACtB,IAAM,EAAA;AAAA,IACF,aAAc,CAAA,UAAA;AAAA,IACd,aAAc,CAAA,WAAA;AAAA,IACd,aAAc,CAAA,WAAA;AAAA,GAClB;AAAA,EACA,IAAM,EAAA,UAAA;AACV,CAAA;;;;"} |