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.6 kB
Source Map (JSON)
{"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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"}