/** * @author Mat Groves http://matgroves.com/ @Doormat23 */ /** * This filter applies a twist effect making display objects appear twisted in the given direction. * * @class TwistFilter * @extends AbstractFilter * @constructor */ PIXI.TwistFilter = function() { PIXI.AbstractFilter.call( this ); this.passes = [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 vec4 dimensions;', 'uniform sampler2D uSampler;', 'uniform float radius;', 'uniform float angle;', 'uniform vec2 offset;', '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);', '}' ]; }; PIXI.TwistFilter.prototype = Object.create( PIXI.AbstractFilter.prototype ); PIXI.TwistFilter.prototype.constructor = PIXI.TwistFilter; /** * This point describes the the offset of the twist. * * @property offset * @type Point */ Object.defineProperty(PIXI.TwistFilter.prototype, 'offset', { get: function() { return this.uniforms.offset.value; }, set: function(value) { this.dirty = true; this.uniforms.offset.value = value; } }); /** * This radius of the twist. * * @property radius * @type Number */ Object.defineProperty(PIXI.TwistFilter.prototype, 'radius', { get: function() { return this.uniforms.radius.value; }, set: function(value) { this.dirty = true; this.uniforms.radius.value = value; } }); /** * This angle of the twist. * * @property angle * @type Number */ Object.defineProperty(PIXI.TwistFilter.prototype, 'angle', { get: function() { return this.uniforms.angle.value; }, set: function(value) { this.dirty = true; this.uniforms.angle.value = value; } });