{"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\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 * @memberof rendering\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, 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        data ||= (uniformGroup.buffer.data as Float32Array);\n        offset ||= 0;\n\n        uniformGroupData.syncFunction(uniformGroup.uniforms, data, 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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"}