Newer
Older
pixi.js / src / core / sprites / webgl / generateMultiTextureShader.js
@clément chenebault clément chenebault on 18 Feb 2016 1 KB first round to clean some jslint errors
var Shader = require('pixi-gl-core').GLShader;
var glslify  = require('glslify');

var fragTemplate = [

    'precision lowp float;',
    'varying vec2 vTextureCoord;',
    'varying vec4 vColor;',
    'varying float vTextureId;',
    'uniform sampler2D uSamplers[%count%];',

    'void main(void){',
        'vec4 color;',
        'int ndx = int(vTextureId);',
        '%forloop%',
        'gl_FragColor = color * vColor;',
    '}'
].join('\n');

function generateMultiTextureShader(gl, maxTextures)
{
    var vertexSrc = glslify('./texture.vert');
    var fragmentSrc = fragTemplate;

    fragmentSrc = fragmentSrc.replace(/\%count\%/gi, maxTextures);
    fragmentSrc = fragmentSrc.replace(/\%forloop\%/gi, generateSampleSrc(maxTextures));

    var shader = new Shader(gl, vertexSrc, fragmentSrc);

    var sampleValues = [];
    for (var i = 0; i < maxTextures; i++) {
        sampleValues[i] = i;
    }

    shader.bind();
    shader.uniforms.uSamplers = sampleValues;

    return shader;
}

function generateSampleSrc(maxTextures)
{
    var src = '';

    src += '\n';
    src += '\n';

    for (var i = 0; i < maxTextures; i++)
    {
        if(i > 0) {
          src += '\nelse ';
        }
        if(i < maxTextures-1) {
          src += 'if(ndx == ' + i + ')';
        }
        src += '\n{';
        src += '\n\tcolor = texture2D(uSamplers['+i+'], vTextureCoord);';
        src += '\n}';
    }

    src += '\n';
    src += '\n';

    return src;
}

module.exports = generateMultiTextureShader;