/**
 * Copyright (C) 2011 by Evan Wallace
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

/**
 *
 * This filter applies a bulge effect
 * @class BulgeFilter
 * @contructor
 */
PIXI.BulgeFilter = function()
{
	PIXI.AbstractFilter.call( this );
 
	this.passes = [this];
 
	// set the uniforms
	this.uniforms = {
		radius: {type: '1f', value: 0.75},
		strength: {type: '1f', value: 0.25},
		center: {type: '2f', value:{x: 0.5, y: 0.6}}
	};

	this.fragmentSrc = [
		'precision mediump float;',
		'varying vec2 vTextureCoord;',
		'uniform sampler2D uSampler;',
		'uniform float radius;',
		'uniform float strength;',
		'uniform vec2 center;',
		'void main(void) {',
		'	vec2 coord = vTextureCoord;',
		'	coord -= center;',
		'	float distance = length(coord);',
		'	if (distance < radius) {',
		'		float percent = distance / radius;',
		'		if (strength > 0.0) {',
		'			coord *= mix(1.0, smoothstep(0.0, radius / distance, percent), strength * 0.75);',
		'		} else {',
		'			coord *= mix(1.0, pow(percent, 1.0 + strength * 0.75) * radius / distance, 1.0 - percent);',
		'		}',
		'	}',
		'	coord += center;',
		'	gl_FragColor = texture2D(uSampler, coord);',
		'}'
	];
};
 
PIXI.BulgeFilter.prototype = Object.create( PIXI.AbstractFilter.prototype );
PIXI.BulgeFilter.prototype.constructor = PIXI.BulgeFilter;