var shaders = {}
shaders["base_effect_shader_vert"] = "// base_effect_shader.vert\nattribute vec4 a_position;\nvarying vec2 v_texCoord;\nattribute vec2 a_texCoord;\nvoid main() {\n	vec4 zeroToOne = a_position / 1.0;\n	vec4 zeroToTwo = zeroToOne * 2.0;\n	vec4 clipSpace = zeroToTwo - 1.0;\n	gl_Position = vec4(clipSpace);\n	v_texCoord = a_texCoord;\n}";
shaders["base_layer_shader_vert"] = "// base_layer_shader.vert\nattribute vec4 a_position;\nuniform mat4 uMatrix;\nuniform mat4 localMatrix;\nvoid main() {\n	gl_Position = uMatrix * localMatrix * a_position;\n}";
shaders["base_layer_with_mask_shader_vert"] = "// base_layer_with_mask_shader.vert\nattribute vec4 a_position;\nuniform mat4 uMatrix;\nuniform mat4 localMatrix;\nvarying vec2 v_texCoord;\nattribute vec2 a_texCoord;\nvoid main() {\n	gl_Position = uMatrix * localMatrix * a_position;\n	v_texCoord = a_texCoord;\n}";
shaders["comp_layer_shader_frag"] = "// comp_layer_shader.frag\nprecision mediump float;\nuniform sampler2D u_image;\nvarying vec2 v_texCoord;\nvoid main() {\n	gl_FragColor = texture2D(u_image, v_texCoord);\n}";
shaders["comp_layer_shader_vert"] = "// comp_layer_shader.vert\nattribute vec4 a_position;\nuniform mat4 uMatrix;\nuniform mat4 localMatrix;\nvarying vec2 v_texCoord;\nattribute vec2 a_texCoord;\nvoid main() {\n	gl_Position = uMatrix * localMatrix * a_position;\n	v_texCoord = a_texCoord;\n}";
shaders["gaussian_blur_shader_frag"] = "// gaussian_blur_shader.frag\nprecision mediump float;\nuniform sampler2D u_image;\nuniform float weights[100];\nuniform int blurriness;\nvarying vec2 vUv;\n\nvec4 calculateColorSum(vec2 onePixel) {\n	// vec4 colorSum = vec4(0.0, 0.0, 0.0, 1.0);\n	vec4 colorSum = vec4(0.0, 0.0, 0.0, 1.0);\n	// vec4 colorSum = texture2D(u_image, vUv);\n	for(int i = 0; i < 50; i += 1) {\n		if(i >= blurriness / 2) {\n			return colorSum;\n		}\n		colorSum += texture2D(u_image, vUv + onePixel * vec2(-1 * ((blurriness / 2) - i), 0)) * weights[i];\n		colorSum += texture2D(u_image, vUv + onePixel * vec2(1 * ((blurriness / 2) - i), 0)) * weights[i];\n\n		// colorSum += vec4(0.0, 1.0, 0.0, 1.0) * weights[i];\n		// colorSum += vec4(0.0, 1.0, 0.0, 1.0) * weights[i];\n		// colorSum += texture2D(u_image, vUv) * weights[i];\n		// colorSum += texture2D(u_image, vUv + onePixel * vec2(1 * ((blurriness / 2) - i), 0)) * weights[i];\n		/* vec4 texturePoint = texture2D(u_image, vUv);\n		if(texturePoint.r == 1.0) {\n			colorSum = vec4(0.0, 0.0, 1.0, 1.0);\n		} */\n	}\n	return colorSum;\n}\n\nvoid main() {\n	vec2 u_textureSize = vec2(1200.0 * 2.5, 600.0 * 2.5);\n	vec2 onePixel = vec2(1.0, 0.0) / u_textureSize;\n	gl_FragColor = calculateColorSum(onePixel);\n	// gl_FragColor = texture2D(u_image, vUv);\n}";
shaders["gaussian_blur_shader_vert"] = "// gaussian_blur_shader.vert\nattribute vec4 a_position;\nattribute vec2 a_texCoord;\nvarying vec2 v_texCoord;\nvarying vec2 vUv;\nvoid main() {\n	vec4 zeroToOne = a_position / 1.0;\n	vec4 zeroToTwo = zeroToOne * 2.0;\n	vec4 clipSpace = zeroToTwo - 1.0;\n	gl_Position = vec4(clipSpace);\n	vUv = a_texCoord;\n}";
shaders["image_layer_shader_frag"] = "// image_layer_shader.frag\nprecision mediump float;\nuniform sampler2D u_image;\nvarying vec2 v_texCoord;\nvoid main() {\n	gl_FragColor = texture2D(u_image, v_texCoord);\n}";
shaders["image_layer_shader_vert"] = "// image_layer_shader.vert\nattribute vec3 a_position;\nuniform mat4 uMatrix;\nuniform mat4 localMatrix;\nvarying vec2 v_texCoord;\nvoid main() {\n	gl_Position = uMatrix * localMatrix * vec4(a_position, 1);\n	v_texCoord = a_position.xy;\n}";
shaders["mask_shader_frag"] = "// mask_shader.frag\nprecision mediump float;\nuniform sampler2D original_image;\nuniform sampler2D mask_image;\nvarying vec2 v_texCoord;\nvoid main() {\n	vec4 original_color = texture2D(original_image, v_texCoord);\n	vec4 mask_color = texture2D(mask_image, v_texCoord);\n	gl_FragColor = vec4(original_color.rgb, mask_color.a * original_color.a);\n}";
shaders["mask_shader_vert"] = "// mask_shader.vert\nattribute vec4 a_position;\nvarying vec2 v_texCoord;\nattribute vec2 a_texCoord;\nvoid main() {\n	vec4 zeroToOne = a_position / 1.0;\n	vec4 zeroToTwo = zeroToOne * 2.0;\n	vec4 clipSpace = zeroToTwo - 1.0;\n	gl_Position = vec4(clipSpace);\n	v_texCoord = a_texCoord;\n}";
shaders["noop_effect_shader_frag"] = "// noop_effect_shader.frag\nprecision mediump float;\nvoid main() {\n	gl_FragColor = vec4(1.0,1.0,0.0,1.0);\n}";
shaders["puppet_pin_shader_frag"] = "// puppet_pin_shader.frag\nprecision mediump float;\nuniform sampler2D u_image;\nvarying vec2 v_texCoord;\nvoid main() {\n	gl_FragColor = texture2D(u_image, v_texCoord);\n}";
shaders["puppet_pin_shader_vert"] = "// puppet_pin_shader.vert\nattribute vec4 a_position;\nvarying vec2 v_texCoord;\nattribute vec2 a_texCoord;\nvoid main() {\n	vec4 zeroToTwo = a_position * 2.0;\n	vec4 clipSpace = zeroToTwo - 1.0;\n	gl_Position = vec4(clipSpace);\n	v_texCoord = a_texCoord;\n}";
shaders["ripple_shader_frag"] = "// ripple_shader.frag\nprecision mediump float;\nuniform sampler2D u_image;\nvarying vec2 vUv;\n\nvec2 fromPolar( vec2 uv ) {\n  uv = vec2( uv.x * cos( uv.y ), uv.x * sin( uv.y ) );\n  return uv + vec2( 0.5 );\n}\nvec2 toPolar( vec2 uv ) {\n  uv -= vec2( 0.5 );\n  return vec2( length( uv ), atan( uv.y, uv.x ));  \n}\n\n\n//sqrt(pow(0.5,2) + pow(0.5,2)) * 2\nfloat diagonal = 1.4142;\nfloat PI = 3.141592;\nfloat wave_width = 9.0;\nfloat wave_height = 0.008;\n\nvoid main() {\n	vec2 vUv_1 = vUv;\n	vUv_1 = toPolar(vUv_1);\n	float angle = (vUv_1.y + PI) * 180.0 / PI;\n	float segment = mod(angle, wave_width);\n	float segment_perc = segment / wave_width;\n	vUv_1.x += wave_height * sin(PI * segment_perc);\n	//vUv_1.x += vUv_1.x;\n	vec2 cart_vUv_1 = fromPolar(vUv_1);\n	if(cart_vUv_1.x < 0.0 || cart_vUv_1.x > 1.0 || cart_vUv_1.y < 0.0 || cart_vUv_1.y > 1.0) {\n		discard;\n	}\n	if(segment_perc < 0.5) {\n	}\n\n	gl_FragColor = texture2D(u_image, cart_vUv_1);\n}";
shaders["ripple_shader_vert"] = "// ripple_shader.vert\nattribute vec4 a_position;\nattribute vec2 a_texCoord;\nvarying vec2 v_texCoord;\nvarying vec2 vUv;\nvoid main() {\n	vec4 zeroToOne = a_position / 1.0;\n	vec4 zeroToTwo = zeroToOne * 2.0;\n	vec4 clipSpace = zeroToTwo - 1.0;\n	gl_Position = vec4(clipSpace);\n	vUv = a_texCoord;\n}";
shaders["solid_layer_shader_frag"] = "// solid_layer_shader.frag\nprecision mediump float;\nuniform vec4 colorUniform;\nvoid main() {\n	gl_FragColor = colorUniform;\n}";
shaders["solid_layer_with_mask_shader_frag"] = "// solid_layer_with_mask_shader.frag\nprecision mediump float;\nuniform vec4 colorUniform;\nvarying vec2 v_texCoord;\nuniform sampler2D mask_image;\nvoid main() {\n	vec4 mask_value = texture2D(mask_image, v_texCoord);\n	gl_FragColor = vec4(colorUniform.rgb, mask_value.r);\n}";
shaders["spherize_shader_frag"] = "// spherize_shader.frag\nprecision mediump float;\nuniform sampler2D u_image;\nvarying vec2 vUv;\n\nvec2 fromPolar( vec2 uv ) {\n  uv = vec2( uv.x * cos( uv.y ), uv.x * sin( uv.y ) );\n  return uv + vec2( 0.5 );\n}\nvec2 toPolar( vec2 uv ) {\n  uv -= vec2( 0.5 );\n  return vec2( length( uv ), atan( uv.y, uv.x ));  \n}\n\n\n//sqrt(pow(0.5,2) + pow(0.5,2)) * 2\nfloat diagonal = 1.4142;\nfloat PI = 3.141592;\nfloat wave_width = 9.0;\nfloat wave_height = 0.008;\n\nvoid main() {\n	vec2 vUv_1 = toPolar(vUv);\n	vUv_1.x += diagonal * sin(PI * vUv_1.x / diagonal);\n	vUv_1 = fromPolar(vUv_1);\n\n	gl_FragColor = texture2D(u_image, vUv_1);\n}";
shaders["tint_shader_frag"] = "// tint_shader.frag\nprecision mediump float;\nuniform sampler2D u_image;\nvarying vec2 v_texCoord;\nuniform float color_amount;\nuniform vec4 whiteToColor;\nuniform vec4 blackToColor;\n\nvoid main() {\n    vec4 textureValue = texture2D(u_image, v_texCoord);\n    float saturation = (textureValue.r + textureValue.g + textureValue.b) / 3.0;\n    vec4 textureMapped = blackToColor + (whiteToColor - blackToColor) * saturation;\n    gl_FragColor = vec4(mix(textureValue.rgb, textureMapped.rgb, color_amount),textureValue.a);\n}";
shaders["track_matte_shader_frag"] = "// track_matte_shader.frag\nprecision mediump float;\nuniform sampler2D original_image;\nuniform sampler2D mask_image;\nuniform float matte_type;\nvarying vec2 v_texCoord;\nvarying vec2 v_texCoord_mask;\nvoid main() {\n	vec4 original_vec = texture2D(original_image, v_texCoord);\n	vec4 mask_vec = texture2D(mask_image, v_texCoord_mask);\n	//vec4 mask_vec = texture2D(mask_image, v_texCoord_mask);\n	float multiplier;\n	if(v_texCoord_mask.x < 0.0 || v_texCoord_mask.y < 0.0 || v_texCoord_mask.x > 1.0 || v_texCoord_mask.y > 1.0) {\n		if(matte_type == 1.0 || matte_type == 3.0 || matte_type == 4.0) {\n			multiplier = 0.0;\n		} else if(matte_type == 2.0) {\n			multiplier = 1.0;\n		}\n	} else {\n		if(matte_type == 1.0) {\n			multiplier = mask_vec.a;\n		} else if(matte_type == 2.0) {\n			multiplier = 1.0 - mask_vec.a;\n		} else if(matte_type == 3.0) {\n			multiplier = (mask_vec.r + mask_vec.g + mask_vec.b) / 3.0;\n			//multiplier = 0.2126*mask_vec.r + 0.7152*mask_vec.g + 0.0722*mask_vec.b;\n			//multiplier = 0.299*mask_vec.r + 0.587*mask_vec.g + 0.114*mask_vec.b;\n			// multiplier = 0.33*mask_vec.r + 0.5*mask_vec.g + 0.16*mask_vec.b;\n		}  else if(matte_type == 4.0) {\n			multiplier = 1.0 - (mask_vec.r + mask_vec.g + mask_vec.b) / 3.0;\n		} \n		//gl_FragColor = mask_vec;\n	}\n	gl_FragColor = vec4(original_vec.rgb,multiplier * original_vec.a);\n	// gl_FragColor = texture2D(mask_image, v_texCoord);\n	//gl_FragColor = vec4(texture2D(u_image, v_texCoord).rgb,0.5);\n	//gl_FragColor = mix(original_vec,mask_vec,0.5);\n	// gl_FragColor = vec4(original_vec.rgb, 0.25);\n	//gl_FragColor = vec4(1.0,0.0,0.0,0.75);\n}";
shaders["track_matte_shader_vert"] = "// track_matte_shader.vert\nattribute vec4 a_position;\nuniform mat4 uMatrix;\n// TODO: Look into using a vec4 for both pairs of coords\nvarying vec2 v_texCoord;\nvarying vec2 v_texCoord_mask;\nattribute vec2 a_texCoord;\nvoid main() {\n	gl_Position = a_position;\n	vec4 zeroToOne = a_position;\n	vec4 zeroToTwo = zeroToOne * 2.0;\n	vec4 clipSpace = zeroToTwo - 1.0;\n	gl_Position = clipSpace;\n	//gl_Position = a_position;\n	v_texCoord = a_texCoord;\n	v_texCoord_mask = (uMatrix * vec4(a_texCoord,1,1)).xy;\n}";
shaders["twirl_shader_frag"] = "// twirl_shader.frag\nprecision mediump float;\nuniform sampler2D u_image;\nvarying vec2 vUv;\nuniform float angle;\nuniform float radius;\nuniform vec2 center;\n\nvec2 fromPolar( vec2 uv ) {\n  uv = vec2( uv.x * cos( uv.y ), uv.x * sin( uv.y ) );\n  return uv + vec2( 0.5 ) + center;\n}\nvec2 toPolar( vec2 uv ) {\n  uv -= vec2( 0.5 ) + center;\n  return vec2( length( uv ), atan( uv.y, uv.x ));  \n}\n\nfloat diagonal = 1.4142; //sqrt(pow(0.5, 2.0) + pow(0.5, 2.0)) * 2.0;\n\nvoid main() {\n	vec2 vUv_1 = toPolar(vUv);\n	if(vUv_1.x < diagonal * radius) {\n		float perc = vUv_1.x / (diagonal * radius);\n		perc = (cos(perc * 3.141592) + 1.0) / 2.0;\n		vUv_1.y += radians(-angle * perc);\n	}\n	vec2 cart_vUv_1 = fromPolar(vUv_1);\n	if(cart_vUv_1.x < 0.0 || cart_vUv_1.x > 1.0 || cart_vUv_1.y < 0.0 || cart_vUv_1.y > 1.0) {\n		discard;\n	} else {\n		gl_FragColor = texture2D(u_image, cart_vUv_1);\n	}\n}";
shaders["twirl_shader_vert"] = "// twirl_shader.vert\nattribute vec4 a_position;\nattribute vec2 a_texCoord;\nvarying vec2 v_texCoord;\nvarying vec2 vUv;\nvoid main() {\n	vec4 zeroToOne = a_position / 1.0;\n	vec4 zeroToTwo = zeroToOne * 2.0;\n	vec4 clipSpace = zeroToTwo - 1.0;\n	gl_Position = vec4(clipSpace);\n	vUv = a_texCoord;\n}";
function get_shader(name) {
return shaders[name];
}
