UNPKG

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">

139 lines (135 loc) 4.83 kB
'use strict'; var Extensions = require('../../../extensions/Extensions.js'); var Matrix = require('../../../maths/matrix/Matrix.js'); var BindGroup = require('../../../rendering/renderers/gpu/shader/BindGroup.js'); var UniformGroup = require('../../../rendering/renderers/shared/shader/UniformGroup.js'); var getAdjustedBlendModeBlend = require('../../../rendering/renderers/shared/state/getAdjustedBlendModeBlend.js'); var colorToUniform = require('../../graphics/gpu/colorToUniform.js'); var BatchableMesh = require('./BatchableMesh.js'); "use strict"; class MeshGpuData { destroy() { } } class MeshPipe { constructor(renderer, adaptor) { this.localUniforms = new UniformGroup.UniformGroup({ uTransformMatrix: { value: new Matrix.Matrix(), type: "mat3x3<f32>" }, uColor: { value: new Float32Array([1, 1, 1, 1]), type: "vec4<f32>" }, uRound: { value: 0, type: "f32" } }); this.localUniformsBindGroup = new BindGroup.BindGroup({ 0: this.localUniforms }); this.renderer = renderer; this._adaptor = adaptor; this._adaptor.init(); } validateRenderable(mesh) { const meshData = this._getMeshData(mesh); const wasBatched = meshData.batched; const isBatched = mesh.batched; meshData.batched = isBatched; if (wasBatched !== isBatched) { return true; } else if (isBatched) { const geometry = mesh._geometry; if (geometry.indices.length !== meshData.indexSize || geometry.positions.length !== meshData.vertexSize) { meshData.indexSize = geometry.indices.length; meshData.vertexSize = geometry.positions.length; return true; } const batchableMesh = this._getBatchableMesh(mesh); if (batchableMesh.texture.uid !== mesh._texture.uid) { batchableMesh._textureMatrixUpdateId = -1; } return !batchableMesh._batcher.checkAndUpdateTexture( batchableMesh, mesh._texture ); } return false; } addRenderable(mesh, instructionSet) { const batcher = this.renderer.renderPipes.batch; const { batched } = this._getMeshData(mesh); if (batched) { const gpuBatchableMesh = this._getBatchableMesh(mesh); gpuBatchableMesh.setTexture(mesh._texture); gpuBatchableMesh.geometry = mesh._geometry; batcher.addToBatch(gpuBatchableMesh, instructionSet); } else { batcher.break(instructionSet); instructionSet.add(mesh); } } updateRenderable(mesh) { if (mesh.batched) { const gpuBatchableMesh = this._getBatchableMesh(mesh); gpuBatchableMesh.setTexture(mesh._texture); gpuBatchableMesh.geometry = mesh._geometry; gpuBatchableMesh._batcher.updateElement(gpuBatchableMesh); } } execute(mesh) { if (!mesh.isRenderable) return; mesh.state.blendMode = getAdjustedBlendModeBlend.getAdjustedBlendModeBlend(mesh.groupBlendMode, mesh.texture._source); const localUniforms = this.localUniforms; localUniforms.uniforms.uTransformMatrix = mesh.groupTransform; localUniforms.uniforms.uRound = this.renderer._roundPixels | mesh._roundPixels; localUniforms.update(); colorToUniform.color32BitToUniform( mesh.groupColorAlpha, localUniforms.uniforms.uColor, 0 ); this._adaptor.execute(this, mesh); } _getMeshData(mesh) { var _a, _b; (_a = mesh._gpuData)[_b = this.renderer.uid] || (_a[_b] = new MeshGpuData()); return mesh._gpuData[this.renderer.uid].meshData || this._initMeshData(mesh); } _initMeshData(mesh) { mesh._gpuData[this.renderer.uid].meshData = { batched: mesh.batched, indexSize: mesh._geometry.indices?.length, vertexSize: mesh._geometry.positions?.length }; return mesh._gpuData[this.renderer.uid].meshData; } _getBatchableMesh(mesh) { var _a, _b; (_a = mesh._gpuData)[_b = this.renderer.uid] || (_a[_b] = new MeshGpuData()); return mesh._gpuData[this.renderer.uid].batchableMesh || this._initBatchableMesh(mesh); } _initBatchableMesh(mesh) { const gpuMesh = new BatchableMesh.BatchableMesh(); gpuMesh.renderable = mesh; gpuMesh.setTexture(mesh._texture); gpuMesh.transform = mesh.groupTransform; gpuMesh.roundPixels = this.renderer._roundPixels | mesh._roundPixels; mesh._gpuData[this.renderer.uid].batchableMesh = gpuMesh; return gpuMesh; } destroy() { this.localUniforms = null; this.localUniformsBindGroup = null; this._adaptor.destroy(); this._adaptor = null; this.renderer = null; } } /** @ignore */ MeshPipe.extension = { type: [ Extensions.ExtensionType.WebGLPipes, Extensions.ExtensionType.WebGPUPipes, Extensions.ExtensionType.CanvasPipes ], name: "mesh" }; exports.MeshGpuData = MeshGpuData; exports.MeshPipe = MeshPipe; //# sourceMappingURL=MeshPipe.js.map