{"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\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\nexport interface GlobalUniformOptions\n{\n    size?: number[],\n    projectionMatrix?: Matrix,\n    worldTransformMatrix?: Matrix\n    worldColor?: number\n    offset?: PointData\n}\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\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 * @memberof rendering\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 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    }\n}\n"],"names":[],"mappings":"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"}