{"version":3,"file":"Program.mjs","sources":["../../src/shader/Program.ts"],"sourcesContent":["import { PRECISION } from '@pixi/constants';\nimport { isMobile, ProgramCache } from '@pixi/utils';\nimport defaultFragment from './defaultProgram.frag';\nimport defaultVertex from './defaultProgram.vert';\nimport { getMaxFragmentPrecision, setPrecision } from './utils';\n\nimport type { GLProgram } from './GLProgram';\n\nlet UID = 0;\n\nconst nameCache: { [key: string]: number } = {};\n\nexport interface IAttributeData\n{\n    type: string;\n    size: number;\n    location: number;\n    name: string;\n}\n\nexport interface IUniformData\n{\n    index: number;\n    type: string;\n    size: number;\n    isArray: boolean;\n    value: any;\n    name: string;\n}\n\nexport interface IProgramExtraData\n{\n    transformFeedbackVaryings?: {\n        names: string[],\n        bufferMode: 'separate' | 'interleaved'\n    }\n}\n\n/**\n * Helper class to create a shader program.\n * @memberof PIXI\n */\nexport class Program\n{\n    /**\n     * Default specify float precision in vertex shader.\n     * @static\n     * @type {PIXI.PRECISION}\n     * @default PIXI.PRECISION.HIGH\n     */\n    public static defaultVertexPrecision: PRECISION = PRECISION.HIGH;\n\n    /**\n     * Default specify float precision in fragment shader.\n     * iOS is best set at highp due to https://github.com/pixijs/pixijs/issues/3742\n     * @static\n     * @type {PIXI.PRECISION}\n     * @default PIXI.PRECISION.MEDIUM\n     */\n    public static defaultFragmentPrecision: PRECISION = isMobile.apple.device\n        ? PRECISION.HIGH\n        : PRECISION.MEDIUM;\n\n    public id: number;\n\n    /** Source code for the vertex shader. */\n    public vertexSrc: string;\n\n    /** Source code for the fragment shader. */\n    public fragmentSrc: string;\n\n    nameCache: any;\n    glPrograms: { [ key: number ]: GLProgram};\n    syncUniforms: any;\n\n    /** Assigned when a program is first bound to the shader system. */\n    attributeData: { [key: string]: IAttributeData};\n\n    /** Assigned when a program is first bound to the shader system. */\n    uniformData: {[key: string]: IUniformData};\n\n    extra: IProgramExtraData = {};\n\n    /**\n     * @param vertexSrc - The source of the vertex shader.\n     * @param fragmentSrc - The source of the fragment shader.\n     * @param name - Name for shader\n     * @param extra - Extra data for shader\n     */\n    constructor(vertexSrc?: string, fragmentSrc?: string, name = 'pixi-shader', extra: IProgramExtraData = {})\n    {\n        this.id = UID++;\n        this.vertexSrc = vertexSrc || Program.defaultVertexSrc;\n        this.fragmentSrc = fragmentSrc || Program.defaultFragmentSrc;\n\n        this.vertexSrc = this.vertexSrc.trim();\n        this.fragmentSrc = this.fragmentSrc.trim();\n\n        this.extra = extra;\n\n        if (this.vertexSrc.substring(0, 8) !== '#version')\n        {\n            name = name.replace(/\\s+/g, '-');\n\n            if (nameCache[name])\n            {\n                nameCache[name]++;\n                name += `-${nameCache[name]}`;\n            }\n            else\n            {\n                nameCache[name] = 1;\n            }\n\n            this.vertexSrc = `#define SHADER_NAME ${name}\\n${this.vertexSrc}`;\n            this.fragmentSrc = `#define SHADER_NAME ${name}\\n${this.fragmentSrc}`;\n\n            this.vertexSrc = setPrecision(\n                this.vertexSrc,\n                Program.defaultVertexPrecision,\n                PRECISION.HIGH\n            );\n            this.fragmentSrc = setPrecision(\n                this.fragmentSrc,\n                Program.defaultFragmentPrecision,\n                getMaxFragmentPrecision()\n            );\n        }\n\n        // currently this does not extract structs only default types\n        // this is where we store shader references..\n        this.glPrograms = {};\n\n        this.syncUniforms = null;\n    }\n\n    /**\n     * The default vertex shader source.\n     * @readonly\n     */\n    static get defaultVertexSrc(): string\n    {\n        return defaultVertex;\n    }\n\n    /**\n     * The default fragment shader source.\n     * @readonly\n     */\n    static get defaultFragmentSrc(): string\n    {\n        return defaultFragment;\n    }\n\n    /**\n     * A short hand function to create a program based of a vertex and fragment shader.\n     *\n     * This method will also check to see if there is a cached program.\n     * @param vertexSrc - The source of the vertex shader.\n     * @param fragmentSrc - The source of the fragment shader.\n     * @param name - Name for shader\n     * @returns A shiny new PixiJS shader program!\n     */\n    static from(vertexSrc?: string, fragmentSrc?: string, name?: string): Program\n    {\n        const key = vertexSrc + fragmentSrc;\n\n        let program = ProgramCache[key];\n\n        if (!program)\n        {\n            ProgramCache[key] = program = new Program(vertexSrc, fragmentSrc, name);\n        }\n\n        return program;\n    }\n}\n"],"names":["_Program"],"mappings":";;;;;;;AAQA,IAAI,MAAM;AAEV,MAAM,YAAuC,CAgChC,GAAA,WAAN,MAAMA,UACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8CI,YAAY,WAAoB,aAAsB,OAAO,eAAe,QAA2B,IACvG;AATA,SAAA,QAA2B,IAUlB,KAAA,KAAK,OACV,KAAK,YAAY,aAAaA,UAAQ,kBACtC,KAAK,cAAc,eAAeA,UAAQ,oBAE1C,KAAK,YAAY,KAAK,UAAU,KAAA,GAChC,KAAK,cAAc,KAAK,YAAY,KAAA,GAEpC,KAAK,QAAQ,OAET,KAAK,UAAU,UAAU,GAAG,CAAC,MAAM,eAEnC,OAAO,KAAK,QAAQ,QAAQ,GAAG,GAE3B,UAAU,IAAI,KAEd,UAAU,IAAI,KACd,QAAQ,IAAI,UAAU,IAAI,CAAC,MAI3B,UAAU,IAAI,IAAI,GAGtB,KAAK,YAAY,uBAAuB,IAAI;AAAA,EAAK,KAAK,SAAS,IAC/D,KAAK,cAAc,uBAAuB,IAAI;AAAA,EAAK,KAAK,WAAW,IAEnE,KAAK,YAAY;AAAA,MACb,KAAK;AAAA,MACLA,UAAQ;AAAA,MACR,UAAU;AAAA,IAAA,GAEd,KAAK,cAAc;AAAA,MACf,KAAK;AAAA,MACLA,UAAQ;AAAA,MACR,wBAAwB;AAAA,IAAA,IAMhC,KAAK,aAAa,CAAC,GAEnB,KAAK,eAAe;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,mBACX;AACW,WAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,qBACX;AACW,WAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,KAAK,WAAoB,aAAsB,MACtD;AACI,UAAM,MAAM,YAAY;AAEpB,QAAA,UAAU,aAAa,GAAG;AAEzB,WAAA,YAED,aAAa,GAAG,IAAI,UAAU,IAAIA,UAAQ,WAAW,aAAa,IAAI,IAGnE;AAAA,EACX;AACJ;AAtIa,SAQK,yBAAoC,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AARnD,SAiBK,2BAAsC,SAAS,MAAM,SAC7D,UAAU,OACV,UAAU;AAnBb,IAAM,UAAN;"}