summaryrefslogtreecommitdiffstats
path: root/Studio/Content/Effect Library/Distortion Sphere.effect
blob: 3ed1e70bc4e12e9f625520dffc2750b38ec43100 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?xml version="1.0" encoding="UTF-8" ?>
<Effect>
	<MetaData>
		<!--Distorts the image in a spherical way.-->
		<Property name="radius" formalName="Radius" min="0" max="1" 	default=".3"		description="Adjusts the distorted area."/>
		<Property name="height" formalName="Height" min="-1" max="1" 	default=".3"		description="Adjusts the distortion 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;
		</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 distortion = 1.0 - dist_to_center * dist_to_center;
        texc = TexCoord - (TexCoord - center) * distortion * height;
    }

  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>