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

136 lines (133 loc) 4.69 kB
import { ExtensionType } from '../../../extensions/Extensions.mjs'; import { Matrix } from '../../../maths/matrix/Matrix.mjs'; import { BindGroup } from '../../../rendering/renderers/gpu/shader/BindGroup.mjs'; import { UniformGroup } from '../../../rendering/renderers/shared/shader/UniformGroup.mjs'; import { getAdjustedBlendModeBlend } from '../../../rendering/renderers/shared/state/getAdjustedBlendModeBlend.mjs'; import { color32BitToUniform } from '../../graphics/gpu/colorToUniform.mjs'; import { BatchableMesh } from './BatchableMesh.mjs'; "use strict"; class MeshGpuData { destroy() { } } class MeshPipe { constructor(renderer, adaptor) { this.localUniforms = new UniformGroup({ uTransformMatrix: { value: new Matrix(), type: "mat3x3<f32>" }, uColor: { value: new Float32Array([1, 1, 1, 1]), type: "vec4<f32>" }, uRound: { value: 0, type: "f32" } }); this.localUniformsBindGroup = new 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(mesh.groupBlendMode, mesh.texture._source); const localUniforms = this.localUniforms; localUniforms.uniforms.uTransformMatrix = mesh.groupTransform; localUniforms.uniforms.uRound = this.renderer._roundPixels | mesh._roundPixels; localUniforms.update(); 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(); 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: [ ExtensionType.WebGLPipes, ExtensionType.WebGPUPipes, ExtensionType.CanvasPipes ], name: "mesh" }; export { MeshGpuData, MeshPipe }; //# sourceMappingURL=MeshPipe.mjs.map