This repository has been archived on 2022-05-21. You can view files and clone it, but cannot push or open issues or pull requests.
LEFTONE/core/loshader/combat_ring.fshader

92 lines
2.0 KiB
Plaintext
Raw Permalink Normal View History

in vec2 v_uv;
in float v_aa;
in float v_range;
in vec2 v_period;
in vec4 v_color;
out vec4 o_color;
vec2 uv_;
float len_;
float theta_;
float atan2(in vec2 p) {
return p.x == 0.? PI/2.*sign(p.y): atan(p.y, p.x);
}
float thetadist(in vec2 p, in float t) {
float a = tan(t);
float b = 1.;
if (cos(t) == 0.) {
a = 1.;
b = 0.;
}
return abs(b*p.y-a*p.x)/sqrt(a*a+b*b);
}
float grid(in float n, in float ri, in float ro) {
float u = PI/n;
float t = floor(theta_/u)*u;
float d = min(thetadist(uv_, t), thetadist(uv_, t+u));
return
step(ri, len_)*step(len_, ro)*
smoothstep(v_aa, .0, d);
}
float belt(in float t1, in float t2, in float r) {
float t1a = smoothstep(v_aa, 0., thetadist(uv_, t1))*step(abs(theta_-t1), .1);
float t2a = smoothstep(v_aa, 0., thetadist(uv_, t2))*step(abs(theta_-t2), .1);
float a = t1a + t2a + step(t1, theta_)*step(theta_, t2);
a *=
(t1a + t2a)*smoothstep(.4, .45, len_) +
smoothstep(r-v_aa, r, len_)*
(1.-max(len_-r, 0.)/.2) +
smoothstep(v_aa, 0., abs(len_-.7*r));
return clamp(a, 0., 1.);
}
float circle(in float r) {
return
smoothstep(v_aa, 0., abs(len_-r));
}
float clockhand(in float t) {
float r = smoothstep(.25, .3, len_)*smoothstep(1., .85, len_);
float a =
r *
smoothstep(v_aa, 0., thetadist(uv_, t)) *
step(abs(theta_-t), .1);
float b =
r * max(1.-abs(theta_-t)/(PI/12.), 0.)*.7;
return a + b;
}
void main(void) {
uv_ = v_uv.yx;
len_ = length(uv_);
theta_ = atan2(uv_);
theta_ = theta_ < 0.? theta_+2.*PI: theta_;
if (v_range <= -1.) {
o_color = v_color;
float a =
grid( 2., .4, 1.) +
grid(60., .75, .8) +
grid(10., .65, .8) +
grid(8., .5, .55) +
grid( 4., .3, .4) +
circle(.8);
o_color.a *= clamp(a, 0., 1.);
} else if (v_range <= 0.) {
o_color = v_color*clockhand(v_period.x*PI*2.);
o_color.a = pow(o_color.a, 2.);
} else {
o_color = v_color;
o_color.a *= belt(v_period.x*PI*2., v_period.y*PI*2., v_range);
}
}