pixi.js
Version:
<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">
1 lines • 12.2 kB
Source Map (JSON)
{"version":3,"file":"MeshPipe.mjs","sources":["../../../../src/scene/mesh/shared/MeshPipe.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\nimport { Matrix } from '../../../maths/matrix/Matrix';\nimport { BindGroup } from '../../../rendering/renderers/gpu/shader/BindGroup';\nimport { UniformGroup } from '../../../rendering/renderers/shared/shader/UniformGroup';\nimport { getAdjustedBlendModeBlend } from '../../../rendering/renderers/shared/state/getAdjustedBlendModeBlend';\nimport { color32BitToUniform } from '../../graphics/gpu/colorToUniform';\nimport { type GPUData } from '../../view/ViewContainer';\nimport { BatchableMesh } from './BatchableMesh';\n\nimport type { InstructionSet } from '../../../rendering/renderers/shared/instructions/InstructionSet';\nimport type {\n InstructionPipe,\n RenderPipe\n} from '../../../rendering/renderers/shared/instructions/RenderPipe';\nimport type { Renderer } from '../../../rendering/renderers/types';\nimport type { Mesh } from './Mesh';\n\n// TODO Record mode is a P2, will get back to this as it's not a priority\n// const recordMode = true;\n\n/**\n * GPUData for Mesh\n * @internal\n */\nexport class MeshGpuData implements GPUData\n{\n public meshData?: MeshData;\n public batchableMesh?: BatchableMesh;\n\n public destroy()\n {\n // BOOM!\n }\n}\n\n/**\n * The data for the mesh\n * @internal\n */\ninterface MeshData\n{\n /** if the mesh is batched or not */\n batched: boolean;\n /** the size of the index buffer */\n indexSize: number;\n /** the size of the vertex buffer */\n vertexSize: number;\n}\n\n/** @internal */\nexport interface MeshAdaptor\n{\n init(): void;\n execute(meshPipe: MeshPipe, mesh: Mesh): void;\n destroy(): void;\n}\n\n/**\n * The MeshPipe is responsible for handling the rendering of Mesh objects.\n * It manages the batching of meshes, updates their GPU data, and executes the rendering instructions.\n * It also handles the local uniforms for each mesh, such as transformation matrices and colors.\n * @category scene\n * @internal\n */\nexport class MeshPipe implements RenderPipe<Mesh>, InstructionPipe<Mesh>\n{\n /** @ignore */\n public static extension = {\n type: [\n ExtensionType.WebGLPipes,\n ExtensionType.WebGPUPipes,\n ExtensionType.CanvasPipes,\n ],\n name: 'mesh',\n } as const;\n\n public localUniforms = new UniformGroup({\n uTransformMatrix: { value: new Matrix(), type: 'mat3x3<f32>' },\n uColor: { value: new Float32Array([1, 1, 1, 1]), type: 'vec4<f32>' },\n uRound: { value: 0, type: 'f32' },\n });\n\n public localUniformsBindGroup = new BindGroup({\n 0: this.localUniforms,\n });\n\n public renderer: Renderer;\n\n private _adaptor: MeshAdaptor;\n\n constructor(renderer: Renderer, adaptor: MeshAdaptor)\n {\n this.renderer = renderer;\n this._adaptor = adaptor;\n\n this._adaptor.init();\n }\n\n public validateRenderable(mesh: Mesh): boolean\n {\n const meshData = this._getMeshData(mesh);\n\n const wasBatched = meshData.batched;\n\n const isBatched = mesh.batched;\n\n meshData.batched = isBatched;\n\n if (wasBatched !== isBatched)\n {\n return true;\n }\n else if (isBatched)\n {\n const geometry = mesh._geometry;\n\n // no need to break the batch if it's the same size\n if (geometry.indices.length !== meshData.indexSize\n || geometry.positions.length !== meshData.vertexSize)\n {\n meshData.indexSize = geometry.indices.length;\n meshData.vertexSize = geometry.positions.length;\n\n return true;\n }\n\n const batchableMesh = this._getBatchableMesh(mesh);\n\n if (batchableMesh.texture.uid !== mesh._texture.uid)\n {\n batchableMesh._textureMatrixUpdateId = -1;\n }\n\n return !batchableMesh._batcher.checkAndUpdateTexture(\n batchableMesh,\n mesh._texture\n );\n }\n\n return false;\n }\n\n public addRenderable(mesh: Mesh, instructionSet: InstructionSet)\n {\n const batcher = this.renderer.renderPipes.batch;\n\n const { batched } = this._getMeshData(mesh);\n\n if (batched)\n {\n const gpuBatchableMesh = this._getBatchableMesh(mesh);\n\n gpuBatchableMesh.setTexture(mesh._texture);\n gpuBatchableMesh.geometry = mesh._geometry;\n\n batcher.addToBatch(gpuBatchableMesh, instructionSet);\n }\n else\n {\n batcher.break(instructionSet);\n\n instructionSet.add(mesh);\n }\n }\n\n public updateRenderable(mesh: Mesh)\n {\n if (mesh.batched)\n {\n const gpuBatchableMesh = this._getBatchableMesh(mesh);\n\n gpuBatchableMesh.setTexture(mesh._texture);\n\n gpuBatchableMesh.geometry = mesh._geometry;\n\n gpuBatchableMesh._batcher.updateElement(gpuBatchableMesh);\n }\n }\n\n public execute(mesh: Mesh)\n {\n if (!mesh.isRenderable) return;\n\n mesh.state.blendMode = getAdjustedBlendModeBlend(mesh.groupBlendMode, mesh.texture._source);\n\n const localUniforms = this.localUniforms;\n\n localUniforms.uniforms.uTransformMatrix = mesh.groupTransform;\n localUniforms.uniforms.uRound = this.renderer._roundPixels | mesh._roundPixels;\n localUniforms.update();\n\n color32BitToUniform(\n mesh.groupColorAlpha,\n localUniforms.uniforms.uColor,\n 0\n );\n\n this._adaptor.execute(this, mesh);\n }\n\n private _getMeshData(mesh: Mesh): MeshData\n {\n mesh._gpuData[this.renderer.uid] ||= new MeshGpuData();\n\n return mesh._gpuData[this.renderer.uid].meshData || this._initMeshData(mesh);\n }\n\n private _initMeshData(mesh: Mesh): MeshData\n {\n mesh._gpuData[this.renderer.uid].meshData = {\n batched: mesh.batched,\n indexSize: mesh._geometry.indices?.length,\n vertexSize: mesh._geometry.positions?.length,\n };\n\n return mesh._gpuData[this.renderer.uid].meshData;\n }\n\n private _getBatchableMesh(mesh: Mesh): BatchableMesh\n {\n mesh._gpuData[this.renderer.uid] ||= new MeshGpuData();\n\n return mesh._gpuData[this.renderer.uid].batchableMesh || this._initBatchableMesh(mesh);\n }\n\n private _initBatchableMesh(mesh: Mesh): BatchableMesh\n {\n // TODO - make this batchable graphics??\n const gpuMesh: BatchableMesh = new BatchableMesh();\n\n gpuMesh.renderable = mesh;\n gpuMesh.setTexture(mesh._texture);\n gpuMesh.transform = mesh.groupTransform;\n gpuMesh.roundPixels = (this.renderer._roundPixels | mesh._roundPixels) as 0 | 1;\n\n mesh._gpuData[this.renderer.uid].batchableMesh = gpuMesh;\n\n return gpuMesh;\n }\n\n public destroy()\n {\n this.localUniforms = null;\n this.localUniformsBindGroup = null;\n\n this._adaptor.destroy();\n this._adaptor = null;\n\n this.renderer = null;\n }\n}\n"],"names":[],"mappings":";;;;;;;;;AAwBO,MAAM,WACb,CAAA;AAAA,EAIW,OACP,GAAA;AAAA,GAEA;AACJ,CAAA;AA+BO,MAAM,QACb,CAAA;AAAA,EAyBI,WAAA,CAAY,UAAoB,OAChC,EAAA;AAfA,IAAO,IAAA,CAAA,aAAA,GAAgB,IAAI,YAAa,CAAA;AAAA,MACpC,kBAAkB,EAAE,KAAA,EAAO,IAAI,MAAO,EAAA,EAAG,MAAM,aAAc,EAAA;AAAA,MAC7D,MAAQ,EAAA,EAAE,KAAO,EAAA,IAAI,YAAa,CAAA,CAAC,CAAG,EAAA,CAAA,EAAG,CAAG,EAAA,CAAC,CAAC,CAAA,EAAG,MAAM,WAAY,EAAA;AAAA,MACnE,MAAQ,EAAA,EAAE,KAAO,EAAA,CAAA,EAAG,MAAM,KAAM,EAAA;AAAA,KACnC,CAAA,CAAA;AAED,IAAO,IAAA,CAAA,sBAAA,GAAyB,IAAI,SAAU,CAAA;AAAA,MAC1C,GAAG,IAAK,CAAA,aAAA;AAAA,KACX,CAAA,CAAA;AAQG,IAAA,IAAA,CAAK,QAAW,GAAA,QAAA,CAAA;AAChB,IAAA,IAAA,CAAK,QAAW,GAAA,OAAA,CAAA;AAEhB,IAAA,IAAA,CAAK,SAAS,IAAK,EAAA,CAAA;AAAA,GACvB;AAAA,EAEO,mBAAmB,IAC1B,EAAA;AACI,IAAM,MAAA,QAAA,GAAW,IAAK,CAAA,YAAA,CAAa,IAAI,CAAA,CAAA;AAEvC,IAAA,MAAM,aAAa,QAAS,CAAA,OAAA,CAAA;AAE5B,IAAA,MAAM,YAAY,IAAK,CAAA,OAAA,CAAA;AAEvB,IAAA,QAAA,CAAS,OAAU,GAAA,SAAA,CAAA;AAEnB,IAAA,IAAI,eAAe,SACnB,EAAA;AACI,MAAO,OAAA,IAAA,CAAA;AAAA,eAEF,SACT,EAAA;AACI,MAAA,MAAM,WAAW,IAAK,CAAA,SAAA,CAAA;AAGtB,MAAI,IAAA,QAAA,CAAS,QAAQ,MAAW,KAAA,QAAA,CAAS,aAC9B,QAAS,CAAA,SAAA,CAAU,MAAW,KAAA,QAAA,CAAS,UAClD,EAAA;AACI,QAAS,QAAA,CAAA,SAAA,GAAY,SAAS,OAAQ,CAAA,MAAA,CAAA;AACtC,QAAS,QAAA,CAAA,UAAA,GAAa,SAAS,SAAU,CAAA,MAAA,CAAA;AAEzC,QAAO,OAAA,IAAA,CAAA;AAAA,OACX;AAEA,MAAM,MAAA,aAAA,GAAgB,IAAK,CAAA,iBAAA,CAAkB,IAAI,CAAA,CAAA;AAEjD,MAAA,IAAI,aAAc,CAAA,OAAA,CAAQ,GAAQ,KAAA,IAAA,CAAK,SAAS,GAChD,EAAA;AACI,QAAA,aAAA,CAAc,sBAAyB,GAAA,CAAA,CAAA,CAAA;AAAA,OAC3C;AAEA,MAAO,OAAA,CAAC,cAAc,QAAS,CAAA,qBAAA;AAAA,QAC3B,aAAA;AAAA,QACA,IAAK,CAAA,QAAA;AAAA,OACT,CAAA;AAAA,KACJ;AAEA,IAAO,OAAA,KAAA,CAAA;AAAA,GACX;AAAA,EAEO,aAAA,CAAc,MAAY,cACjC,EAAA;AACI,IAAM,MAAA,OAAA,GAAU,IAAK,CAAA,QAAA,CAAS,WAAY,CAAA,KAAA,CAAA;AAE1C,IAAA,MAAM,EAAE,OAAA,EAAY,GAAA,IAAA,CAAK,aAAa,IAAI,CAAA,CAAA;AAE1C,IAAA,IAAI,OACJ,EAAA;AACI,MAAM,MAAA,gBAAA,GAAmB,IAAK,CAAA,iBAAA,CAAkB,IAAI,CAAA,CAAA;AAEpD,MAAiB,gBAAA,CAAA,UAAA,CAAW,KAAK,QAAQ,CAAA,CAAA;AACzC,MAAA,gBAAA,CAAiB,WAAW,IAAK,CAAA,SAAA,CAAA;AAEjC,MAAQ,OAAA,CAAA,UAAA,CAAW,kBAAkB,cAAc,CAAA,CAAA;AAAA,KAGvD,MAAA;AACI,MAAA,OAAA,CAAQ,MAAM,cAAc,CAAA,CAAA;AAE5B,MAAA,cAAA,CAAe,IAAI,IAAI,CAAA,CAAA;AAAA,KAC3B;AAAA,GACJ;AAAA,EAEO,iBAAiB,IACxB,EAAA;AACI,IAAA,IAAI,KAAK,OACT,EAAA;AACI,MAAM,MAAA,gBAAA,GAAmB,IAAK,CAAA,iBAAA,CAAkB,IAAI,CAAA,CAAA;AAEpD,MAAiB,gBAAA,CAAA,UAAA,CAAW,KAAK,QAAQ,CAAA,CAAA;AAEzC,MAAA,gBAAA,CAAiB,WAAW,IAAK,CAAA,SAAA,CAAA;AAEjC,MAAiB,gBAAA,CAAA,QAAA,CAAS,cAAc,gBAAgB,CAAA,CAAA;AAAA,KAC5D;AAAA,GACJ;AAAA,EAEO,QAAQ,IACf,EAAA;AACI,IAAA,IAAI,CAAC,IAAK,CAAA,YAAA;AAAc,MAAA,OAAA;AAExB,IAAA,IAAA,CAAK,MAAM,SAAY,GAAA,yBAAA,CAA0B,KAAK,cAAgB,EAAA,IAAA,CAAK,QAAQ,OAAO,CAAA,CAAA;AAE1F,IAAA,MAAM,gBAAgB,IAAK,CAAA,aAAA,CAAA;AAE3B,IAAc,aAAA,CAAA,QAAA,CAAS,mBAAmB,IAAK,CAAA,cAAA,CAAA;AAC/C,IAAA,aAAA,CAAc,QAAS,CAAA,MAAA,GAAS,IAAK,CAAA,QAAA,CAAS,eAAe,IAAK,CAAA,YAAA,CAAA;AAClE,IAAA,aAAA,CAAc,MAAO,EAAA,CAAA;AAErB,IAAA,mBAAA;AAAA,MACI,IAAK,CAAA,eAAA;AAAA,MACL,cAAc,QAAS,CAAA,MAAA;AAAA,MACvB,CAAA;AAAA,KACJ,CAAA;AAEA,IAAK,IAAA,CAAA,QAAA,CAAS,OAAQ,CAAA,IAAA,EAAM,IAAI,CAAA,CAAA;AAAA,GACpC;AAAA,EAEQ,aAAa,IACrB,EAAA;AAzMJ,IAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AA0MQ,IAAA,CAAA,EAAA,GAAA,IAAA,CAAK,UAAL,EAAc,GAAA,IAAA,CAAK,SAAS,GAA5B,CAAA,KAAA,EAAA,CAAA,EAAA,CAAA,GAAqC,IAAI,WAAY,EAAA,CAAA,CAAA;AAErD,IAAO,OAAA,IAAA,CAAK,SAAS,IAAK,CAAA,QAAA,CAAS,GAAG,CAAE,CAAA,QAAA,IAAY,IAAK,CAAA,aAAA,CAAc,IAAI,CAAA,CAAA;AAAA,GAC/E;AAAA,EAEQ,cAAc,IACtB,EAAA;AACI,IAAA,IAAA,CAAK,QAAS,CAAA,IAAA,CAAK,QAAS,CAAA,GAAG,EAAE,QAAW,GAAA;AAAA,MACxC,SAAS,IAAK,CAAA,OAAA;AAAA,MACd,SAAA,EAAW,IAAK,CAAA,SAAA,CAAU,OAAS,EAAA,MAAA;AAAA,MACnC,UAAA,EAAY,IAAK,CAAA,SAAA,CAAU,SAAW,EAAA,MAAA;AAAA,KAC1C,CAAA;AAEA,IAAA,OAAO,IAAK,CAAA,QAAA,CAAS,IAAK,CAAA,QAAA,CAAS,GAAG,CAAE,CAAA,QAAA,CAAA;AAAA,GAC5C;AAAA,EAEQ,kBAAkB,IAC1B,EAAA;AA3NJ,IAAA,IAAA,EAAA,EAAA,EAAA,CAAA;AA4NQ,IAAA,CAAA,EAAA,GAAA,IAAA,CAAK,UAAL,EAAc,GAAA,IAAA,CAAK,SAAS,GAA5B,CAAA,KAAA,EAAA,CAAA,EAAA,CAAA,GAAqC,IAAI,WAAY,EAAA,CAAA,CAAA;AAErD,IAAO,OAAA,IAAA,CAAK,SAAS,IAAK,CAAA,QAAA,CAAS,GAAG,CAAE,CAAA,aAAA,IAAiB,IAAK,CAAA,kBAAA,CAAmB,IAAI,CAAA,CAAA;AAAA,GACzF;AAAA,EAEQ,mBAAmB,IAC3B,EAAA;AAEI,IAAM,MAAA,OAAA,GAAyB,IAAI,aAAc,EAAA,CAAA;AAEjD,IAAA,OAAA,CAAQ,UAAa,GAAA,IAAA,CAAA;AACrB,IAAQ,OAAA,CAAA,UAAA,CAAW,KAAK,QAAQ,CAAA,CAAA;AAChC,IAAA,OAAA,CAAQ,YAAY,IAAK,CAAA,cAAA,CAAA;AACzB,IAAA,OAAA,CAAQ,WAAe,GAAA,IAAA,CAAK,QAAS,CAAA,YAAA,GAAe,IAAK,CAAA,YAAA,CAAA;AAEzD,IAAA,IAAA,CAAK,QAAS,CAAA,IAAA,CAAK,QAAS,CAAA,GAAG,EAAE,aAAgB,GAAA,OAAA,CAAA;AAEjD,IAAO,OAAA,OAAA,CAAA;AAAA,GACX;AAAA,EAEO,OACP,GAAA;AACI,IAAA,IAAA,CAAK,aAAgB,GAAA,IAAA,CAAA;AACrB,IAAA,IAAA,CAAK,sBAAyB,GAAA,IAAA,CAAA;AAE9B,IAAA,IAAA,CAAK,SAAS,OAAQ,EAAA,CAAA;AACtB,IAAA,IAAA,CAAK,QAAW,GAAA,IAAA,CAAA;AAEhB,IAAA,IAAA,CAAK,QAAW,GAAA,IAAA,CAAA;AAAA,GACpB;AACJ,CAAA;AAAA;AA1La,QAAA,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,MAAA;AACV,CAAA;;;;"}