{"version":3,"file":"compileHighShader.mjs","sources":["../../../../src/rendering/high-shader/compiler/compileHighShader.ts"],"sourcesContent":["import { addBits } from './utils/addBits';\nimport { compileHooks } from './utils/compileHooks';\nimport { compileInputs } from './utils/compileInputs';\nimport { compileOutputs } from './utils/compileOutputs';\nimport { injectBits } from './utils/injectBits';\n\nimport type { HighShaderBit, HighShaderSource } from './types';\n\n/**\n * A high template consists of vertex and fragment source\n * @internal\n */\nexport interface HighShaderTemplate\n{\n    name?: string;\n    fragment: string;\n    vertex: string;\n}\n\n/** @internal */\nexport interface CompileHighShaderOptions\n{\n    template: HighShaderTemplate;\n    bits: HighShaderBit[];\n}\n\nconst cacheMap: {[key: string]: HighShaderSource} = Object.create(null);\nconst bitCacheMap: Map<HighShaderBit, number> = new Map();\n\nlet CACHE_UID = 0;\n\n/**\n * This function will take a HighShader template, some High fragments and then merge them in to a shader source.\n * @param options\n * @param options.template\n * @param options.bits\n * @internal\n */\nexport function compileHighShader({\n    template,\n    bits\n}: CompileHighShaderOptions): HighShaderSource\n{\n    const cacheId = generateCacheId(template, bits);\n\n    if (cacheMap[cacheId]) return cacheMap[cacheId];\n\n    const { vertex, fragment } = compileInputsAndOutputs(template, bits);\n\n    cacheMap[cacheId] = compileBits(vertex, fragment, bits);\n\n    return cacheMap[cacheId];\n}\n\n/**\n * This function will take a HighShader template, some High fragments and then merge them in to a shader source.\n * It is specifically for WebGL and does not compile inputs and outputs.\n * @param options\n * @param options.template - The HighShader template containing vertex and fragment source.\n * @param options.bits - An array of HighShaderBit objects to be compiled into the shader.\n * @returns A HighShaderSource object containing the compiled vertex and fragment shaders.\n * @internal\n */\nexport function compileHighShaderGl({\n    template,\n    bits\n}: CompileHighShaderOptions): HighShaderSource\n{\n    const cacheId = generateCacheId(template, bits);\n\n    if (cacheMap[cacheId]) return cacheMap[cacheId];\n\n    cacheMap[cacheId] = compileBits(template.vertex, template.fragment, bits);\n\n    return cacheMap[cacheId];\n}\n\nfunction compileInputsAndOutputs(template: HighShaderTemplate, bits: HighShaderBit[])\n{\n    const vertexFragments = bits.map((shaderBit) => shaderBit.vertex).filter((v) => !!v);\n    const fragmentFragments = bits.map((shaderBit) => shaderBit.fragment).filter((v) => !!v);\n\n    // WebGPU compile inputs and outputs..\n    let compiledVertex = compileInputs(vertexFragments, template.vertex, true);\n\n    compiledVertex = compileOutputs(vertexFragments, compiledVertex);\n\n    const compiledFragment = compileInputs(fragmentFragments, template.fragment, true);\n\n    return {\n        vertex: compiledVertex,\n        fragment: compiledFragment,\n    };\n}\n\nfunction generateCacheId(template: HighShaderTemplate, bits: HighShaderBit[]): string\n{\n    return bits\n        .map((highFragment) =>\n        {\n            if (!bitCacheMap.has(highFragment))\n            {\n                bitCacheMap.set(highFragment, CACHE_UID++);\n            }\n\n            return bitCacheMap.get(highFragment);\n        })\n        .sort((a, b) => a - b)\n        .join('-') + template.vertex + template.fragment;\n}\n\nfunction compileBits(vertex: string, fragment: string, bits: HighShaderBit[])\n{\n    const vertexParts = compileHooks(vertex);\n    const fragmentParts = compileHooks(fragment);\n\n    bits.forEach((shaderBit) =>\n    {\n        addBits(shaderBit.vertex, vertexParts, shaderBit.name);\n        addBits(shaderBit.fragment, fragmentParts, shaderBit.name);\n    });\n\n    return {\n        vertex: injectBits(vertex, vertexParts),\n        fragment: injectBits(fragment, fragmentParts),\n    };\n}\n"],"names":[],"mappings":"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"}