Newer
Older
pixi.js / src / filters / AsciiFilter.js
@Chad Engler Chad Engler on 26 Dec 2014 2 KB refactored the filters
var AbstractFilter = require('./AbstractFilter');

/**
 * @author Vico @vicocotea
 * original shader : https://www.shadertoy.com/view/lssGDj by @movAX13h
 */

/**
 * An ASCII filter.
 *
 * @class
 * @extends AbstractFilter
 * @namespace PIXI
 */
function AsciiFilter() {
    AbstractFilter.call(this);

    // set the uniforms
    this.uniforms = {
        dimensions: { type: '4fv', value: new Float32Array([10000, 100, 10, 10]) },
        pixelSize:  { type: '1f', value: 8}
    };

    this.fragmentSrc = [
        'precision mediump float;',

        'uniform vec4 dimensions;',
        'uniform float pixelSize;',
        'uniform sampler2D uSampler;',

        'float character(float n, vec2 p)',
        '{',
        '    p = floor(p*vec2(4.0, -4.0) + 2.5);',
        '    if (clamp(p.x, 0.0, 4.0) == p.x && clamp(p.y, 0.0, 4.0) == p.y)',
        '    {',
        '        if (int(mod(n/exp2(p.x + 5.0*p.y), 2.0)) == 1) return 1.0;',
        '    }',
        '    return 0.0;',
        '}',

        'void main()',
        '{',
        '    vec2 uv = gl_FragCoord.xy;',
        '    vec3 col = texture2D(uSampler, floor( uv / pixelSize ) * pixelSize / dimensions.xy).rgb;',

        '    #ifdef HAS_GREENSCREEN',
        '    float gray = (col.r + col.b)/2.0;',
        '    #else',
        '    float gray = (col.r + col.g + col.b)/3.0;',
        '    #endif',

        '    float n =  65536.0;             // .',
        '    if (gray > 0.2) n = 65600.0;    // :',
        '    if (gray > 0.3) n = 332772.0;   // *',
        '    if (gray > 0.4) n = 15255086.0; // o',
        '    if (gray > 0.5) n = 23385164.0; // &',
        '    if (gray > 0.6) n = 15252014.0; // 8',
        '    if (gray > 0.7) n = 13199452.0; // @',
        '    if (gray > 0.8) n = 11512810.0; // #',

        '    vec2 p = mod( uv / ( pixelSize * 0.5 ), 2.0) - vec2(1.0);',
        '    col = col * character(n, p);',

        '    gl_FragColor = vec4(col, 1.0);',
        '}'
    ];
};

AsciiFilter.prototype = Object.create(AbstractFilter.prototype);
AsciiFilter.prototype.constructor = AsciiFilter;
module.exports = AsciiFilter;

Object.defineProperties(AsciiFilter.prototype, {
    /**
     * The pixel size used by the filter.
     *
     * @member {number}
     * @memberof AsciiFilter#
     */
    size: {
        get: function () {
            return this.uniforms.pixelSize.value;
        },
        set: function (value) {
            this.uniforms.pixelSize.value = value;
        }
    }
});