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

129 lines (126 loc) 4.54 kB
import { ExtensionType } from '../../../../extensions/Extensions.mjs'; import { Matrix } from '../../../../maths/matrix/Matrix.mjs'; import { Point } from '../../../../maths/point/Point.mjs'; import { color32BitToUniform } from '../../../../scene/graphics/gpu/colorToUniform.mjs'; import { BindGroup } from '../../gpu/shader/BindGroup.mjs'; import { RendererType } from '../../types.mjs'; import { UniformGroup } from '../shader/UniformGroup.mjs'; "use strict"; class GlobalUniformSystem { constructor(renderer) { this._stackIndex = 0; this._globalUniformDataStack = []; this._uniformsPool = []; this._activeUniforms = []; this._bindGroupPool = []; this._activeBindGroups = []; this._renderer = renderer; } reset() { this._stackIndex = 0; for (let i = 0; i < this._activeUniforms.length; i++) { this._uniformsPool.push(this._activeUniforms[i]); } for (let i = 0; i < this._activeBindGroups.length; i++) { this._bindGroupPool.push(this._activeBindGroups[i]); } this._activeUniforms.length = 0; this._activeBindGroups.length = 0; } start(options) { this.reset(); this.push(options); } bind({ size, projectionMatrix, worldTransformMatrix, worldColor, offset }) { const renderTarget = this._renderer.renderTarget.renderTarget; const currentGlobalUniformData = this._stackIndex ? this._globalUniformDataStack[this._stackIndex - 1] : { projectionData: renderTarget, worldTransformMatrix: new Matrix(), worldColor: 4294967295, offset: new Point() }; const globalUniformData = { projectionMatrix: projectionMatrix || this._renderer.renderTarget.projectionMatrix, resolution: size || renderTarget.size, worldTransformMatrix: worldTransformMatrix || currentGlobalUniformData.worldTransformMatrix, worldColor: worldColor || currentGlobalUniformData.worldColor, offset: offset || currentGlobalUniformData.offset, bindGroup: null }; const uniformGroup = this._uniformsPool.pop() || this._createUniforms(); this._activeUniforms.push(uniformGroup); const uniforms = uniformGroup.uniforms; uniforms.uProjectionMatrix = globalUniformData.projectionMatrix; uniforms.uResolution = globalUniformData.resolution; uniforms.uWorldTransformMatrix.copyFrom(globalUniformData.worldTransformMatrix); uniforms.uWorldTransformMatrix.tx -= globalUniformData.offset.x; uniforms.uWorldTransformMatrix.ty -= globalUniformData.offset.y; color32BitToUniform( globalUniformData.worldColor, uniforms.uWorldColorAlpha, 0 ); uniformGroup.update(); let bindGroup; if (this._renderer.renderPipes.uniformBatch) { bindGroup = this._renderer.renderPipes.uniformBatch.getUniformBindGroup(uniformGroup, false); } else { bindGroup = this._bindGroupPool.pop() || new BindGroup(); this._activeBindGroups.push(bindGroup); bindGroup.setResource(uniformGroup, 0); } globalUniformData.bindGroup = bindGroup; this._currentGlobalUniformData = globalUniformData; } push(options) { this.bind(options); this._globalUniformDataStack[this._stackIndex++] = this._currentGlobalUniformData; } pop() { this._currentGlobalUniformData = this._globalUniformDataStack[--this._stackIndex - 1]; if (this._renderer.type === RendererType.WEBGL) { this._currentGlobalUniformData.bindGroup.resources[0].update(); } } get bindGroup() { return this._currentGlobalUniformData.bindGroup; } get globalUniformData() { return this._currentGlobalUniformData; } get uniformGroup() { return this._currentGlobalUniformData.bindGroup.resources[0]; } _createUniforms() { const globalUniforms = new UniformGroup({ uProjectionMatrix: { value: new Matrix(), type: "mat3x3<f32>" }, uWorldTransformMatrix: { value: new Matrix(), type: "mat3x3<f32>" }, // TODO - someone smart - set this to be a unorm8x4 rather than a vec4<f32> uWorldColorAlpha: { value: new Float32Array(4), type: "vec4<f32>" }, uResolution: { value: [0, 0], type: "vec2<f32>" } }, { isStatic: true }); return globalUniforms; } destroy() { this._renderer = null; } } /** @ignore */ GlobalUniformSystem.extension = { type: [ ExtensionType.WebGLSystem, ExtensionType.WebGPUSystem, ExtensionType.CanvasSystem ], name: "globalUniforms" }; export { GlobalUniformSystem }; //# sourceMappingURL=GlobalUniformSystem.mjs.map