{"version":3,"file":"generateUboSyncPolyfill.mjs","sources":["../../../src/unsafe-eval/ubo/generateUboSyncPolyfill.ts"],"sourcesContent":["import { WGSL_TO_STD40_SIZE } from '../../rendering/renderers/gl/shader/utils/createUboElementsSTD40';\nimport { WGSL_ALIGN_SIZE_DATA } from '../../rendering/renderers/gpu/shader/utils/createUboElementsWGSL';\nimport { uniformParsers } from '../../rendering/renderers/shared/shader/utils/uniformParsers';\nimport { uboParserFunctions, uboSingleFunctionsSTD40, uboSingleFunctionsWGSL } from './uboSyncFunctions';\n\nimport type { UboElement, UniformsSyncCallback } from '../../rendering/renderers/shared/shader/types';\nimport type { UniformGroup } from '../../rendering/renderers/shared/shader/UniformGroup';\nimport type { UboUploadFunction } from './uboSyncFunctions';\n\nexport function generateUboSyncPolyfillSTD40(uboElements: UboElement[]): UniformsSyncCallback\n{\n    return generateUboSyncPolyfill(\n        uboElements,\n        uboSingleFunctionsSTD40,\n        (uboElement: UboElement) =>\n        {\n            const rowSize = Math.max(WGSL_TO_STD40_SIZE[uboElement.data.type] / 16, 1);\n            const elementSize = (uboElement.data.value as Array<number>).length / uboElement.data.size;// size / rowSize;\n            const remainder = (4 - (elementSize % 4)) % 4;\n\n            return (_name: string, data: Float32Array, offset: number, _uv: any, v: any) =>\n            {\n                let t = 0;\n\n                for (let i = 0; i < (uboElement.data.size * rowSize); i++)\n                {\n                    for (let j = 0; j < elementSize; j++)\n                    {\n                        data[offset++] = v[t++];\n                    }\n\n                    offset += remainder;\n                }\n            };\n        }\n\n    );\n}\n\nexport function generateUboSyncPolyfillWGSL(uboElements: UboElement[]): UniformsSyncCallback\n{\n    return generateUboSyncPolyfill(\n        uboElements,\n        uboSingleFunctionsWGSL,\n        (uboElement: UboElement) =>\n        {\n            const { size, align } = WGSL_ALIGN_SIZE_DATA[uboElement.data.type];\n\n            const remainder = (size - align) / 4;\n\n            return (_name: string, data: Float32Array, offset: number, _uv: any, v: any) =>\n            {\n                let t = 0;\n\n                for (let i = 0; i < uboElement.data.size * (size / 4); i++)\n                {\n                    for (let j = 0; j < (size / 4); j++)\n                    {\n                        data[offset++] = v[t++];\n                    }\n                    offset += remainder;\n                }\n            };\n        }\n    );\n}\n\nfunction generateUboSyncPolyfill(\n    uboElements: UboElement[],\n    uboFunctions: Record<string, UboUploadFunction>,\n    arrayUploadFunction: (uboElement: UboElement) => UboUploadFunction\n): UniformsSyncCallback\n{\n    // loop through all the uniforms..\n    const functionMap: Record<string, {offset: number, func: UboUploadFunction}> = {};\n\n    for (const i in uboElements)\n    {\n        const uboElement = uboElements[i];\n        const uniform = uboElement.data;\n\n        let parsed = false;\n\n        functionMap[uniform.name] = {\n            offset: uboElement.offset / 4,\n            func: null\n        };\n\n        for (let j = 0; j < uniformParsers.length; j++)\n        {\n            const parser = uniformParsers[j];\n\n            if (uniform.type === parser.type && parser.test(uniform))\n            {\n                functionMap[uniform.name].func = uboParserFunctions[j];\n\n                parsed = true;\n\n                break;\n            }\n        }\n\n        // if not parsed...\n\n        if (!parsed)\n        {\n            if (uniform.size === 1)\n            {\n                functionMap[uniform.name].func = uboFunctions[uniform.type];\n            }\n            else\n            {\n                functionMap[uniform.name].func = arrayUploadFunction(uboElement);\n            }\n        }\n    }\n\n    return (\n        uniforms: UniformGroup,\n        data: Float32Array,\n        offset: number\n    ) =>\n    {\n        for (const i in functionMap)\n        {\n            functionMap[i].func(i, data, offset + functionMap[i].offset, uniforms, uniforms[i as keyof typeof uniforms]);\n        }\n    };\n}\n"],"names":[],"mappings":"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"}