shader_type canvas_item; render_mode blend_premul_alpha; const float TAU = 6.283185307; const float PI = 3.1415926536; const vec4 dbg_color = vec4(1.0, 0.0, 0.0, 1.0); uniform int num_receptors = 8; uniform float receptor_offset = 0.0; uniform vec4 line_color : hint_color = vec4(0.0, 0.0, 1.0, 1.0); uniform vec4 dot_color : hint_color = vec4(0.0, 0.0, 1.0, 1.0); uniform vec4 shadow_color : hint_color = vec4(0.0, 0.0, 0.0, 0.57); //uniform float bps = 1.0; uniform float line_thickness = 0.006; uniform float dot_radius = 0.033; uniform float shadow_thickness = 0.01; uniform float px = 0.002; // Represents 1px in UV space, for AA purposes uniform float px2 = 0.004; // Represents 2px in UV space, for AA purposes uniform float alpha = 1.0; //void vertex() { //} float angle_diff(float a, float b) { float d = mod((a - b), TAU); if (d > PI) d = TAU - d; return d; } vec2 line_alpha(float dist) { // Returns [line, shadow] float d = abs(dist - 1.0) - line_thickness; return clamp(vec2(-1.0 - d/px, 1.0 - d/shadow_thickness), 0.0, 1.0); } vec2 dot_alpha(vec2 uv) { // Returns [dot, shadow] vec2 output = vec2(0.0); // Iterate over all the receptors and check distance to them float receptor_spacing = TAU/float(num_receptors); for (float rads=receptor_offset; rads<TAU; rads+=receptor_spacing){ // Check for dot distance vec2 dot_uv = vec2(cos(rads), -sin(rads)); float d = distance(uv, dot_uv) - dot_radius; output = clamp(vec2(-1.0 - d/px, 1.0 - d/shadow_thickness), output, vec2(1.0)); } return output; } void fragment() { if (COLOR.rgba != dbg_color) { // Can't use return in fragment() function lowp float dist = distance(UV, vec2(0.0)); lowp float angle = atan(-UV.y, UV.x); vec4 lds_alpha = vec4(0.0); lds_alpha.yw = dot_alpha(UV); lds_alpha.xz = clamp(line_alpha(dist), vec2(0.0), vec2(1.0-lds_alpha.y)); lds_alpha.z += lds_alpha.w*(1.0-lds_alpha.z); lds_alpha = clamp(lds_alpha, 0.0, 1.0); lds_alpha.z *= 1.0-min(dot(lds_alpha.xy, vec2(1.0)), 1.0); lds_alpha.z = max(pow(lds_alpha.z, 2.0)-0.125, 0.0); lds_alpha.z *= shadow_color.a; COLOR.rgb = (line_color.rgb*lds_alpha.x) + (dot_color.rgb*lds_alpha.y) + (shadow_color.rgb*lds_alpha.z); COLOR.a = lds_alpha.y + lds_alpha.x*(1.0-lds_alpha.y); COLOR.a += lds_alpha.z*(1.0-COLOR.a); COLOR = clamp(COLOR, 0.0, 1.0); COLOR *= alpha; } }