/*{
"CATEGORIES": [
"Geometry"
],
"CREDIT": "by VIDVOX",
"INPUTS": [
{
"DEFAULT": 0.5,
"MAX": 1,
"MIN": 0,
"NAME": "spacing",
"TYPE": "float"
},
{
"DEFAULT": 0.05,
"MAX": 1,
"MIN": 0,
"NAME": "line_width",
"TYPE": "float"
},
{
"DEFAULT": 0.25,
"MAX": 1,
"MIN": -1,
"NAME": "angle",
"TYPE": "float"
},
{
"DEFAULT": 0,
"MAX": 1,
"MIN": 0,
"NAME": "shift",
"TYPE": "float"
},
{
"DEFAULT": [
1,
1,
1,
1
],
"NAME": "color1",
"TYPE": "color"
},
{
"DEFAULT": [
0,
0,
0,
1
],
"NAME": "color2",
"TYPE": "color"
}
],
"ISFVSN": "2"
}
*/
const float pi = 3.14159265359;
float pattern() {
float s = sin(angle * pi);
float c = cos(angle * pi);
vec2 tex = isf_FragNormCoord * RENDERSIZE;
float spaced = RENDERSIZE.y * spacing;
vec2 point = vec2( c * tex.x - s * tex.y, s * tex.x + c * tex.y ) * max(1.0/spaced,0.001);
float d = point.y;
float w = line_width;
if (w > spacing) {
w = 0.99*spacing;
}
return ( mod(d + shift*spacing + w * 0.5,spacing) );
}
void main() {
// determine if we are on a line
// math goes something like, figure out distance to the closest line, then draw color2 if we're within range
// y = m*x + b
// m = (y1-y0)/(x1-x0) = tan(angle)
vec4 out_color = color2;
float w = line_width;
if (w > spacing) {
w = 0.99*spacing;
}
float pat = pattern();
if ((pat > 0.0)&&(pat <= w)) {
float percent = (1.0-abs(w-2.0*pat)/w);
percent = clamp(percent,0.0,1.0);
out_color = mix(color2,color1,percent);
}
gl_FragColor = out_color;
}