{"version":3,"file":"GenerateShaderSyncCode.mjs","sources":["../../../../../src/rendering/renderers/gl/shader/GenerateShaderSyncCode.ts"],"sourcesContent":["import { BufferResource } from '../../shared/buffer/BufferResource';\nimport { UniformGroup } from '../../shared/shader/UniformGroup';\nimport { TextureSource } from '../../shared/texture/sources/TextureSource';\n\nimport type { Shader } from '../../shared/shader/Shader';\nimport type { GlShaderSystem, ShaderSyncFunction } from './GlShaderSystem';\n\n/**\n * Generates the a function that will efficiently sync shader resources with the GPU.\n * @param shader - The shader to generate the code for\n * @param shaderSystem - An instance of the shader system\n * @internal\n */\nexport function generateShaderSyncCode(shader: Shader, shaderSystem: GlShaderSystem): ShaderSyncFunction\n{\n    const funcFragments: string[] = [];\n\n    /**\n     * rS = renderer.shader\n     * sS = shaderSystem\n     * sD = shaderData\n     * g = shader.groups\n     * s = shader\n     * r = renderer\n     * ugS = renderer.uniformGroupSystem\n     */\n    const headerFragments: string[] = [`\n        var g = s.groups;\n        var sS = r.shader;\n        var p = s.glProgram;\n        var ugS = r.uniformGroup;\n        var resources;\n    `];\n\n    let addedTextreSystem = false;\n    let textureCount = 0;\n\n    const programData = shaderSystem._getProgramData(shader.glProgram);\n\n    for (const i in shader.groups)\n    {\n        const group = shader.groups[i];\n\n        funcFragments.push(`\n            resources = g[${i}].resources;\n        `);\n\n        for (const j in group.resources)\n        {\n            const resource = group.resources[j];\n\n            if (resource instanceof UniformGroup)\n            {\n                if (resource.ubo)\n                {\n                    const resName = shader._uniformBindMap[i][Number(j)];\n\n                    funcFragments.push(`\n                        sS.bindUniformBlock(\n                            resources[${j}],\n                            '${resName}',\n                            ${shader.glProgram._uniformBlockData[resName].index}\n                        );\n                    `);\n                }\n                else\n                {\n                    funcFragments.push(`\n                        ugS.updateUniformGroup(resources[${j}], p, sD);\n                    `);\n                }\n            }\n            else if (resource instanceof BufferResource)\n            {\n                const resName = shader._uniformBindMap[i][Number(j)];\n\n                funcFragments.push(`\n                    sS.bindUniformBlock(\n                        resources[${j}],\n                        '${resName}',\n                        ${shader.glProgram._uniformBlockData[resName].index}\n                    );\n                `);\n            }\n            else if (resource instanceof TextureSource)\n            {\n                const uniformName = shader._uniformBindMap[i as unknown as number][j as unknown as number];\n\n                const uniformData = programData.uniformData[uniformName];\n\n                if (uniformData)\n                {\n                    if (!addedTextreSystem)\n                    {\n                        addedTextreSystem = true;\n                        headerFragments.push(`\n                        var tS = r.texture;\n                        `);\n                    }\n\n                    shaderSystem._gl.uniform1i(uniformData.location, textureCount);\n\n                    funcFragments.push(`\n                        tS.bind(resources[${j}], ${textureCount});\n                    `);\n\n                    textureCount++;\n                }\n            }\n        }\n    }\n\n    const functionSource = [...headerFragments, ...funcFragments].join('\\n');\n\n    // eslint-disable-next-line no-new-func\n    return new Function('r', 's', 'sD', functionSource) as ShaderSyncFunction;\n}\n"],"names":[],"mappings":";;;;;AAaO,SAAS,sBAAA,CAAuB,QAAgB,YAAA,EACvD;AACI,EAAA,MAAM,gBAA0B,EAAC;AAWjC,EAAA,MAAM,kBAA4B,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAMlC,CAAA;AAED,EAAA,IAAI,iBAAA,GAAoB,KAAA;AACxB,EAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,EAAA,MAAM,WAAA,GAAc,YAAA,CAAa,eAAA,CAAgB,MAAA,CAAO,SAAS,CAAA;AAEjE,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,MAAA,EACvB;AACI,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA;AAE7B,IAAA,aAAA,CAAc,IAAA,CAAK;AAAA,0BAAA,EACC,CAAC,CAAA;AAAA,QAAA,CACpB,CAAA;AAED,IAAA,KAAA,MAAW,CAAA,IAAK,MAAM,SAAA,EACtB;AACI,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA;AAElC,MAAA,IAAI,oBAAoB,YAAA,EACxB;AACI,QAAA,IAAI,SAAS,GAAA,EACb;AACI,UAAA,MAAM,UAAU,MAAA,CAAO,eAAA,CAAgB,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA;AAEnD,UAAA,aAAA,CAAc,IAAA,CAAK;AAAA;AAAA,sCAAA,EAEC,CAAC,CAAA;AAAA,6BAAA,EACV,OAAO,CAAA;AAAA,4BAAA,EACR,MAAA,CAAO,SAAA,CAAU,iBAAA,CAAkB,OAAO,EAAE,KAAK;AAAA;AAAA,oBAAA,CAE1D,CAAA;AAAA,QACL,CAAA,MAEA;AACI,UAAA,aAAA,CAAc,IAAA,CAAK;AAAA,yDAAA,EACoB,CAAC,CAAA;AAAA,oBAAA,CACvC,CAAA;AAAA,QACL;AAAA,MACJ,CAAA,MAAA,IACS,oBAAoB,cAAA,EAC7B;AACI,QAAA,MAAM,UAAU,MAAA,CAAO,eAAA,CAAgB,CAAC,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,CAAA;AAEnD,QAAA,aAAA,CAAc,IAAA,CAAK;AAAA;AAAA,kCAAA,EAEC,CAAC,CAAA;AAAA,yBAAA,EACV,OAAO,CAAA;AAAA,wBAAA,EACR,MAAA,CAAO,SAAA,CAAU,iBAAA,CAAkB,OAAO,EAAE,KAAK;AAAA;AAAA,gBAAA,CAE1D,CAAA;AAAA,MACL,CAAA,MAAA,IACS,oBAAoB,aAAA,EAC7B;AACI,QAAA,MAAM,WAAA,GAAc,MAAA,CAAO,eAAA,CAAgB,CAAsB,EAAE,CAAsB,CAAA;AAEzF,QAAA,MAAM,WAAA,GAAc,WAAA,CAAY,WAAA,CAAY,WAAW,CAAA;AAEvD,QAAA,IAAI,WAAA,EACJ;AACI,UAAA,IAAI,CAAC,iBAAA,EACL;AACI,YAAA,iBAAA,GAAoB,IAAA;AACpB,YAAA,eAAA,CAAgB,IAAA,CAAK;AAAA;AAAA,wBAAA,CAEpB,CAAA;AAAA,UACL;AAEA,UAAA,YAAA,CAAa,GAAA,CAAI,SAAA,CAAU,WAAA,CAAY,QAAA,EAAU,YAAY,CAAA;AAE7D,UAAA,aAAA,CAAc,IAAA,CAAK;AAAA,0CAAA,EACK,CAAC,MAAM,YAAY,CAAA;AAAA,oBAAA,CAC1C,CAAA;AAED,UAAA,YAAA,EAAA;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,GAAG,eAAA,EAAiB,GAAG,aAAa,CAAA,CAAE,KAAK,IAAI,CAAA;AAGvE,EAAA,OAAO,IAAI,QAAA,CAAS,GAAA,EAAK,GAAA,EAAK,MAAM,cAAc,CAAA;AACtD;;;;"}