Newer
Older
pixi.js / packages / core / src / shader / extractUniformsFromSrc.js
@Matt Karl Matt Karl on 31 Oct 2017 1 KB Next Restructure for v5 (#4387)
import glCore from 'pixi-gl-core';

const defaultValue = glCore.shader.defaultValue;

export default function extractUniformsFromSrc(vertexSrc, fragmentSrc, mask)
{
    const vertUniforms = extractUniformsFromString(vertexSrc, mask);
    const fragUniforms = extractUniformsFromString(fragmentSrc, mask);

    return Object.assign(vertUniforms, fragUniforms);
}

function extractUniformsFromString(string)
{
    const maskRegex = new RegExp('^(projectionMatrix|uSampler|translationMatrix)$');

    const uniforms = {};
    let nameSplit;

    // clean the lines a little - remove extra spaces / teabs etc
    // then split along ';'
    const lines = string.replace(/\s+/g, ' ')
        .split(/\s*;\s*/);

    // loop through..
    for (let i = 0; i < lines.length; i++)
    {
        const line = lines[i].trim();

        if (line.indexOf('uniform') > -1)
        {
            const splitLine = line.split(' ');
            const type = splitLine[1];

            let name = splitLine[2];
            let size = 1;

            if (name.indexOf('[') > -1)
            {
                // array!
                nameSplit = name.split(/\[|]/);
                name = nameSplit[0];
                size *= Number(nameSplit[1]);
            }

            if (!name.match(maskRegex))
            {
                uniforms[name] = {
                    value: defaultValue(type, size),
                    dirtyId: 0,
                    name,
                    type,
                };
            }
        }
    }

    return uniforms;
}