{"version":3,"file":"UboSystem.mjs","sources":["../../../../../src/rendering/renderers/shared/shader/UboSystem.ts"],"sourcesContent":["import { unsafeEvalSupported } from '../../../../utils/browser/unsafeEvalSupported';\nimport { Buffer } from '../buffer/Buffer';\nimport { BufferUsage } from '../buffer/const';\n\nimport type { System } from '../system/System';\nimport type { UboElement, UboLayout, UniformData, UniformsSyncCallback } from './types';\nimport type { UniformGroup } from './UniformGroup';\n\n/** @internal */\nexport interface UboAdaptor\n{\n    createUboElements: (uniformData: UniformData[]) => UboLayout;\n    generateUboSync: (uboElements: UboElement[]) => UniformsSyncCallback;\n}\n\n/**\n * System plugin to the renderer to manage uniform buffers.\n * @category rendering\n * @advanced\n */\nexport class UboSystem implements System\n{\n    /** Cache of uniform buffer layouts and sync functions, so we don't have to re-create them */\n    private _syncFunctionHash: Record<string, {\n        layout: UboLayout,\n        syncFunction: (uniforms: Record<string, any>, data: Float32Array, dataInt32: Int32Array, offset: number) => void\n    }> = Object.create(null);\n\n    private readonly _adaptor: UboAdaptor;\n\n    constructor(adaptor: UboAdaptor)\n    {\n        this._adaptor = adaptor;\n\n        // Validation check that this environment support `new Function`\n        this._systemCheck();\n    }\n\n    /**\n     * Overridable function by `pixi.js/unsafe-eval` to silence\n     * throwing an error if platform doesn't support unsafe-evals.\n     * @private\n     */\n    private _systemCheck(): void\n    {\n        if (!unsafeEvalSupported())\n        {\n            throw new Error('Current environment does not allow unsafe-eval, '\n                 + 'please use pixi.js/unsafe-eval module to enable support.');\n        }\n    }\n\n    public ensureUniformGroup(uniformGroup: UniformGroup): void\n    {\n        const uniformData = this.getUniformGroupData(uniformGroup);\n\n        uniformGroup.buffer ||= new Buffer({\n            data: new Float32Array(uniformData.layout.size / 4),\n            usage: BufferUsage.UNIFORM | BufferUsage.COPY_DST,\n        });\n    }\n\n    public getUniformGroupData(uniformGroup: UniformGroup)\n    {\n        return this._syncFunctionHash[uniformGroup._signature] || this._initUniformGroup(uniformGroup);\n    }\n\n    private _initUniformGroup(uniformGroup: UniformGroup)\n    {\n        const uniformGroupSignature = uniformGroup._signature;\n\n        let uniformData = this._syncFunctionHash[uniformGroupSignature];\n\n        if (!uniformData)\n        {\n            const elements = Object.keys(uniformGroup.uniformStructures).map((i) => uniformGroup.uniformStructures[i]);\n\n            const layout = this._adaptor.createUboElements(elements);\n\n            const syncFunction = this._generateUboSync(layout.uboElements);\n\n            uniformData = this._syncFunctionHash[uniformGroupSignature] = {\n                layout,\n                syncFunction\n            };\n        }\n\n        return this._syncFunctionHash[uniformGroupSignature];\n    }\n\n    private _generateUboSync(\n        uboElements: UboElement[],\n    ): UniformsSyncCallback\n    {\n        return this._adaptor.generateUboSync(uboElements);\n    }\n\n    public syncUniformGroup(uniformGroup: UniformGroup, data?: Float32Array, offset?: number): boolean\n    {\n        const uniformGroupData = this.getUniformGroupData(uniformGroup);\n\n        uniformGroup.buffer ||= new Buffer({\n            data: new Float32Array(uniformGroupData.layout.size / 4),\n            usage: BufferUsage.UNIFORM | BufferUsage.COPY_DST,\n        });\n\n        let dataInt32: Int32Array = null;\n\n        if (!data)\n        {\n            data = uniformGroup.buffer.data as Float32Array;\n            dataInt32 = uniformGroup.buffer.dataInt32;\n        }\n        offset ||= 0;\n\n        uniformGroupData.syncFunction(uniformGroup.uniforms, data, dataInt32, offset);\n\n        return true;\n    }\n\n    public updateUniformGroup(uniformGroup: UniformGroup): boolean\n    {\n        if (uniformGroup.isStatic && !uniformGroup._dirtyId) return false;\n        uniformGroup._dirtyId = 0;\n\n        const synced = this.syncUniformGroup(uniformGroup);\n\n        uniformGroup.buffer.update();\n\n        return synced;\n    }\n\n    public destroy(): void\n    {\n        this._syncFunctionHash = null;\n    }\n}\n"],"names":[],"mappings":"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"}