| #ifdef GL_ES |
| precision mediump float; |
| #endif |
| |
| uniform vec4 infiniteRect; |
| uniform vec4 inputBBox[1]; |
| |
| varying vec4 outputBBox; |
| |
| uniform vec2 center; |
| uniform float radius; |
| uniform float blur; |
| |
| |
| const float pi = 3.141592653; |
| const float pi_twice = 2.0 * pi; |
| const float pi_half = pi / 2.0; |
| |
| |
| void addPoint(inout vec4 rect, vec2 p) { |
| rect.xy = min(rect.xy, p.xy); |
| rect.zw = max(rect.zw, p.xy); |
| } |
| |
| void addBlurredPointBox(inout vec4 rect, vec2 p) |
| { |
| |
| |
| |
| float distance = length(p - center); |
| float angle = atan(p.y - center.y, p.x - center.x); |
| |
| |
| float dist_ = max(distance - radius, 0.0); |
| float blurLen = radians(max(blur, 0.0)) * dist_; |
| |
| |
| float blur_ = blurLen / max(distance, 0.01); |
| |
| vec2 angleRange = vec2(angle - blur_, angle + blur_); |
| |
| |
| addPoint(rect, center + distance * vec2(cos(angleRange.x), sin(angleRange.x))); |
| addPoint(rect, center + distance * vec2(cos(angleRange.y), sin(angleRange.y))); |
| |
| |
| float blur_twice = 2.0 * blur_; |
| |
| if(mod( - angleRange.x, pi_twice) < blur_twice) |
| addPoint(rect, center + vec2(distance, 0.0)); |
| if(mod(pi_half - angleRange.x, pi_twice) < blur_twice) |
| addPoint(rect, center + vec2(0.0, distance)); |
| if(mod(pi - angleRange.x, pi_twice) < blur_twice) |
| addPoint(rect, center + vec2(-distance, 0.0)); |
| if(mod(-pi_half - angleRange.x, pi_twice) < blur_twice) |
| addPoint(rect, center + vec2(0.0, -distance)); |
| } |
| |
| void main( void ) |
| { |
| outputBBox = inputBBox[0]; |
| |
| if(outputBBox != infiniteRect) |
| { |
| |
| addBlurredPointBox(outputBBox, inputBBox[0].xy); |
| addBlurredPointBox(outputBBox, inputBBox[0].xw); |
| addBlurredPointBox(outputBBox, inputBBox[0].zy); |
| addBlurredPointBox(outputBBox, inputBBox[0].zw); |
| } |
| |
| gl_Position = vec4(0.0); |
| } |