1/*
2     Dot 'n bloom shader
3     Author: Themaister
4     License: Public domain
5*/
6// modified by slime73 for use with love pixeleffects
7
8
9extern vec2 textureSize;
10
11const float gamma = 2.4;
12const float shine = 0.05;
13const float blend = 0.65;
14
15float dist(vec2 coord, vec2 source)
16{
17	vec2 delta = coord - source;
18	return sqrt(dot(delta, delta));
19}
20
21float color_bloom(vec3 color)
22{
23	const vec3 gray_coeff = vec3(0.30, 0.59, 0.11);
24	float bright = dot(color, gray_coeff);
25	return mix(1.0 + shine, 1.0 - shine, bright);
26}
27
28vec3 lookup(float offset_x, float offset_y, vec2 coord)
29{
30	vec2 offset = vec2(offset_x, offset_y);
31	vec3 color = Texel(_tex0_, coord).rgb;
32	float delta = dist(fract(gl_TexCoord[0].xy * textureSize), offset + vec2(0.5));
33	return color * exp(-gamma * delta * color_bloom(color));
34}
35
36vec4 effect(vec4 vcolor, Image texture, vec2 tex, vec2 pixel_coords)
37{
38	float dx = 1.0 / textureSize.x;
39	float dy = 1.0 / textureSize.y;
40
41	// number a = Texel(texture, tex).a;
42
43	vec2 c00 = tex + vec2(-dx, -dy);
44	vec2 c10 = tex + vec2(  0, -dy);
45	vec2 c20 = tex + vec2( dx, -dy);
46	vec2 c01 = tex + vec2(-dx,   0);
47	vec2 c11 = tex + vec2(  0,   0);
48	vec2 c21 = tex + vec2( dx,   0);
49	vec2 c02 = tex + vec2(-dx,  dy);
50	vec2 c12 = tex + vec2(  0,  dy);
51	vec2 c22 = tex + vec2( dx,  dy);
52
53	vec3 mid_color = lookup(0.0, 0.0, c11);
54	vec3 color = vec3(0.0);
55	color += lookup(-1.0, -1.0, c00);
56	color += lookup( 0.0, -1.0, c10);
57	color += lookup( 1.0, -1.0, c20);
58	color += lookup(-1.0,  0.0, c01);
59	color += mid_color;
60	color += lookup( 1.0,  0.0, c21);
61	color += lookup(-1.0,  1.0, c02);
62	color += lookup( 0.0,  1.0, c12);
63	color += lookup( 1.0,  1.0, c22);
64	vec3 out_color = mix(1.2 * mid_color, color, blend);
65
66	return vec4(out_color, 1.0);
67}
68