diff options
Diffstat (limited to 'Studio/Content/Effect Library/Distortion Spiral.effect')
-rw-r--r-- | Studio/Content/Effect Library/Distortion Spiral.effect | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/Studio/Content/Effect Library/Distortion Spiral.effect b/Studio/Content/Effect Library/Distortion Spiral.effect new file mode 100644 index 0000000..a5a9697 --- /dev/null +++ b/Studio/Content/Effect Library/Distortion Spiral.effect @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<Effect> + <MetaData> + <!--Distorts the image in a spiraling way.--> + <Property name="radius" formalName="Radius" min="0" max="1" default=".3" description="Adjusts the distorted area."/> + <Property name="spiral" formalName="Spiral" min="-10" max="10" default="1.0" description="Adjusts the spiraling amount."/> + <Property name="center" formalName="Center" type="Float2" default="0.5 0.5" description="Adjusts the focus point of the distortion."/> + </MetaData> + <Shaders> + <Shared> +varying vec2 center_vec; +float PI2 = radians(360.0); + </Shared> + <Shader> + <VertexShader> +void vert () +{ + center_vec = TexCoord - center; + //Multiply by x/y ratio so we see a sphere on the screen + //instead of an ellipse. + center_vec.y *= Texture0Info.y / Texture0Info.x; +} + </VertexShader> + <FragmentShader> +<![CDATA[ +void frag() +{ + float dist_to_center = length(center_vec) / radius;; + + vec2 texc; + if(dist_to_center > 1.0) { + texc = TexCoord; + } else { + float rotation_amount = (1.0 - dist_to_center) * (1.0 - dist_to_center); + float r = PI2 * rotation_amount * spiral / 4.0; + float cos_r = cos(r); + float sin_r = sin(r); + mat2 rotation = mat2(cos_r, sin_r, -sin_r, cos_r); + texc = center + rotation * (TexCoord - center); + } + + if ( texc.x < 0.0 || texc.x > 1.0 || texc.y < 0.0 || texc.y > 1.0 ) + gl_FragColor = vec4(0.0); + else + colorOutput(texture2D_0(texc)); +} +]]> + </FragmentShader> + </Shader> + </Shaders> +</Effect>
\ No newline at end of file |