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

1 lines 12.9 kB
{"version":3,"file":"GlobalUniformSystem.mjs","sources":["../../../../../src/rendering/renderers/shared/renderTarget/GlobalUniformSystem.ts"],"sourcesContent":["import { ExtensionType } from '../../../../extensions/Extensions';\nimport { Matrix } from '../../../../maths/matrix/Matrix';\nimport { Point } from '../../../../maths/point/Point';\nimport { color32BitToUniform } from '../../../../scene/graphics/gpu/colorToUniform';\nimport { BindGroup } from '../../gpu/shader/BindGroup';\nimport { type Renderer, RendererType } from '../../types';\nimport { UniformGroup } from '../shader/UniformGroup';\n\nimport type { PointData } from '../../../../maths/point/PointData';\nimport type { GlRenderTargetSystem } from '../../gl/renderTarget/GlRenderTargetSystem';\nimport type { GpuRenderTargetSystem } from '../../gpu/renderTarget/GpuRenderTargetSystem';\nimport type { WebGPURenderer } from '../../gpu/WebGPURenderer';\nimport type { UboSystem } from '../shader/UboSystem';\nimport type { System } from '../system/System';\n\n/**\n * Type definition for the global uniforms used in the renderer.\n * This includes projection matrix, world transform matrix, world color, and resolution.\n * @category rendering\n * @advanced\n */\nexport type GlobalUniformGroup = UniformGroup<{\n uProjectionMatrix: { value: Matrix; type: 'mat3x3<f32>' }\n uWorldTransformMatrix: { value: Matrix; type: 'mat3x3<f32>' }\n uWorldColorAlpha: { value: Float32Array; type: 'vec4<f32>' }\n uResolution: { value: number[]; type: 'vec2<f32>' }\n}>;\n\n/**\n * Options for the global uniforms system.\n * This includes size, projection matrix, world transform matrix, world color, and offset.\n * @category rendering\n * @advanced\n */\nexport interface GlobalUniformOptions\n{\n size?: number[],\n projectionMatrix?: Matrix,\n worldTransformMatrix?: Matrix\n worldColor?: number\n offset?: PointData\n}\n\n/**\n * Data structure for the global uniforms used in the renderer.\n * This includes the projection matrix, world transform matrix, world color, resolution, and bind group.\n * @category rendering\n * @advanced\n */\nexport interface GlobalUniformData\n{\n projectionMatrix: Matrix\n worldTransformMatrix: Matrix\n worldColor: number\n resolution: number[]\n offset: PointData\n bindGroup: BindGroup\n}\n\n/** @internal */\nexport interface GlobalUniformRenderer\n{\n renderTarget: GlRenderTargetSystem | GpuRenderTargetSystem\n renderPipes: Renderer['renderPipes'];\n ubo: UboSystem;\n type: RendererType;\n}\n\n/**\n * System plugin to the renderer to manage global uniforms for the renderer.\n * @category rendering\n * @advanced\n */\nexport class GlobalUniformSystem implements System\n{\n /** @ignore */\n public static extension = {\n type: [\n ExtensionType.WebGLSystem,\n ExtensionType.WebGPUSystem,\n ExtensionType.CanvasSystem,\n ],\n name: 'globalUniforms',\n } as const;\n\n private readonly _renderer: GlobalUniformRenderer;\n\n private _stackIndex = 0;\n private _globalUniformDataStack: GlobalUniformData[] = [];\n\n private readonly _uniformsPool: GlobalUniformGroup[] = [];\n private readonly _activeUniforms: GlobalUniformGroup[] = [];\n\n private readonly _bindGroupPool: BindGroup[] = [];\n private readonly _activeBindGroups: BindGroup[] = [];\n\n private _currentGlobalUniformData: GlobalUniformData;\n\n constructor(renderer: GlobalUniformRenderer)\n {\n this._renderer = renderer;\n }\n\n public reset()\n {\n this._stackIndex = 0;\n\n for (let i = 0; i < this._activeUniforms.length; i++)\n {\n this._uniformsPool.push(this._activeUniforms[i]);\n }\n\n for (let i = 0; i < this._activeBindGroups.length; i++)\n {\n this._bindGroupPool.push(this._activeBindGroups[i]);\n }\n\n this._activeUniforms.length = 0;\n this._activeBindGroups.length = 0;\n }\n\n public start(options: GlobalUniformOptions): void\n {\n this.reset();\n\n this.push(options);\n }\n\n public bind({\n size,\n projectionMatrix,\n worldTransformMatrix,\n worldColor,\n offset,\n }: GlobalUniformOptions)\n {\n const renderTarget = this._renderer.renderTarget.renderTarget;\n\n const currentGlobalUniformData = this._stackIndex ? this._globalUniformDataStack[this._stackIndex - 1] : {\n projectionData: renderTarget,\n worldTransformMatrix: new Matrix(),\n worldColor: 0xFFFFFFFF,\n offset: new Point(),\n };\n\n const globalUniformData: GlobalUniformData = {\n projectionMatrix: projectionMatrix || this._renderer.renderTarget.projectionMatrix,\n resolution: size || renderTarget.size,\n worldTransformMatrix: worldTransformMatrix || currentGlobalUniformData.worldTransformMatrix,\n worldColor: worldColor || currentGlobalUniformData.worldColor,\n offset: offset || currentGlobalUniformData.offset,\n bindGroup: null,\n };\n\n const uniformGroup = this._uniformsPool.pop() || this._createUniforms();\n\n this._activeUniforms.push(uniformGroup);\n\n const uniforms = uniformGroup.uniforms;\n\n uniforms.uProjectionMatrix = globalUniformData.projectionMatrix;\n\n uniforms.uResolution = globalUniformData.resolution;\n\n uniforms.uWorldTransformMatrix.copyFrom(globalUniformData.worldTransformMatrix);\n\n uniforms.uWorldTransformMatrix.tx -= globalUniformData.offset.x;\n uniforms.uWorldTransformMatrix.ty -= globalUniformData.offset.y;\n\n color32BitToUniform(\n globalUniformData.worldColor,\n uniforms.uWorldColorAlpha,\n 0\n );\n\n uniformGroup.update();\n\n let bindGroup: BindGroup;\n\n if ((this._renderer as WebGPURenderer).renderPipes.uniformBatch)\n {\n bindGroup = (this._renderer as WebGPURenderer).renderPipes.uniformBatch.getUniformBindGroup(uniformGroup, false);\n }\n else\n {\n bindGroup = this._bindGroupPool.pop() || new BindGroup();\n this._activeBindGroups.push(bindGroup);\n bindGroup.setResource(uniformGroup, 0);\n }\n\n globalUniformData.bindGroup = bindGroup;\n\n this._currentGlobalUniformData = globalUniformData;\n }\n\n public push(options: GlobalUniformOptions)\n {\n this.bind(options);\n\n this._globalUniformDataStack[this._stackIndex++] = this._currentGlobalUniformData;\n }\n\n public pop()\n {\n this._currentGlobalUniformData = this._globalUniformDataStack[--this._stackIndex - 1];\n\n // for webGL we need to update the uniform group here\n // as we are not using bind groups\n if (this._renderer.type === RendererType.WEBGL)\n {\n (this._currentGlobalUniformData.bindGroup.resources[0] as UniformGroup).update();\n }\n }\n\n get bindGroup(): BindGroup\n {\n return this._currentGlobalUniformData.bindGroup;\n }\n\n get globalUniformData()\n {\n return this._currentGlobalUniformData;\n }\n\n get uniformGroup()\n {\n return this._currentGlobalUniformData.bindGroup.resources[0] as UniformGroup;\n }\n\n private _createUniforms(): GlobalUniformGroup\n {\n const globalUniforms = new UniformGroup({\n uProjectionMatrix: { value: new Matrix(), type: 'mat3x3<f32>' },\n uWorldTransformMatrix: { value: new Matrix(), type: 'mat3x3<f32>' },\n // TODO - someone smart - set this to be a unorm8x4 rather than a vec4<f32>\n uWorldColorAlpha: { value: new Float32Array(4), type: 'vec4<f32>' },\n uResolution: { value: [0, 0], type: 'vec2<f32>' },\n }, {\n isStatic: true,\n });\n\n return globalUniforms;\n }\n\n public destroy()\n {\n (this._renderer as null) = null;\n this._globalUniformDataStack.length = 0;\n this._uniformsPool.length = 0;\n this._activeUniforms.length = 0;\n this._bindGroupPool.length = 0;\n this._activeBindGroups.length = 0;\n this._currentGlobalUniformData = null;\n }\n}\n"],"names":[],"mappings":"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"}