var AbstractFilter = require('./AbstractFilter'); /** * This filter applies a twist effect making display objects appear twisted in the given direction. * * @class * @extends AbstractFilter * @namespace PIXI */ function TwistFilter() { AbstractFilter.call(this); // set the uniforms this.uniforms = { radius: { type: '1f', value: 0.5}, angle: { type: '1f', value: 5}, offset: { type: '2f', value: { x: 0.5, y: 0.5 } } }; this.fragmentSrc = [ 'precision mediump float;', 'varying vec2 vTextureCoord;', 'varying vec4 vColor;', 'uniform float radius;', 'uniform float angle;', 'uniform vec2 offset;', 'uniform sampler2D uSampler;', 'void main(void) {', ' vec2 coord = vTextureCoord - offset;', ' float distance = length(coord);', ' if (distance < radius) {', ' float ratio = (radius - distance) / radius;', ' float angleMod = ratio * ratio * angle;', ' float s = sin(angleMod);', ' float c = cos(angleMod);', ' coord = vec2(coord.x * c - coord.y * s, coord.x * s + coord.y * c);', ' }', ' gl_FragColor = texture2D(uSampler, coord+offset);', '}' ]; }; TwistFilter.prototype = Object.create(AbstractFilter.prototype); TwistFilter.prototype.constructor = TwistFilter; module.exports = TwistFilter; Object.defineProperties(TwistFilter.prototype, { /** * This point describes the the offset of the twist. * * @member {Point} * @memberof TwistFilter# */ offset: { get: function () { return this.uniforms.offset.value; }, set: function (value) { this.uniforms.offset.value = value; } }, /** * This radius of the twist. * * @member {number} * @memberof TwistFilter# */ radius: { get: function () { return this.uniforms.radius.value; }, set: function (value) { this.uniforms.radius.value = value; } }, /** * This angle of the twist. * * @member {number} * @memberof TwistFilter# */ angle: { get: function () { return this.uniforms.angle.value; }, set: function (value) { this.uniforms.angle.value = value; } } });