2021-11-12 19:56:30 +01:00
|
|
|
#include brush_common_decl
|
2020-11-03 06:08:02 +01:00
|
|
|
|
2020-10-17 21:04:19 +02:00
|
|
|
// BEGIN_PATTERN
|
|
|
|
float brush_function(vec2 uv) {
|
|
|
|
return clamp(max(0.0, 1.0-length(2.0*(uv-vec2(0.5)))) / 0.5, 0.0, 1.0);
|
2020-10-15 08:47:55 +02:00
|
|
|
}
|
|
|
|
|
2020-10-17 21:04:19 +02:00
|
|
|
vec4 pattern_function(vec2 uv) {
|
2020-10-19 23:13:45 +02:00
|
|
|
return vec4(fract(10.0*uv.x+length(uv-vec2(0.5))*10.0), 0.0, 0.0, 1.0);
|
2020-10-17 21:04:19 +02:00
|
|
|
}
|
|
|
|
// END_PATTERN
|
|
|
|
|
2020-11-08 15:10:46 +01:00
|
|
|
float brush(vec2 uv) {
|
|
|
|
return clamp(brush_opacity*brush_function(uv)/(1.0-brush_hardness), 0.0, 1.0);
|
|
|
|
}
|
|
|
|
|
2020-10-15 08:47:55 +02:00
|
|
|
void fragment() {
|
2021-11-12 19:56:30 +01:00
|
|
|
vec2 bs;
|
|
|
|
vec2 bp;
|
|
|
|
vec2 bpp;
|
|
|
|
vec2 p;
|
|
|
|
if (texture_space) {
|
|
|
|
float min_size = min(rect_size.x, rect_size.y);
|
|
|
|
bs = vec2(brush_size)/min_size;
|
|
|
|
bp = brush_pos/min_size;
|
|
|
|
bpp = brush_ppos/min_size;
|
|
|
|
p = texture(view2tex_tex, UV).xy/bs;
|
|
|
|
} else {
|
|
|
|
bs = vec2(brush_size)/rect_size;
|
|
|
|
bp = brush_pos/rect_size;
|
|
|
|
bpp = brush_ppos/rect_size;
|
|
|
|
p = UV/bs;
|
|
|
|
}
|
|
|
|
vec2 b = bp/bs;
|
|
|
|
vec2 bv = (bpp-bp)/bs;
|
2020-10-15 08:47:55 +02:00
|
|
|
float x = clamp(dot(p-b, bv)/dot(bv, bv), 0.0, 1.0);
|
|
|
|
vec2 local_uv = p-(b+x*bv);
|
2020-10-24 12:43:31 +02:00
|
|
|
vec2 local_uv2 = p-b-bv;
|
|
|
|
mat2 texture_rotation = mat2(vec2(cos(pattern_angle), sin(pattern_angle)), vec2(-sin(pattern_angle), cos(pattern_angle)));
|
|
|
|
local_uv = texture_rotation*local_uv;
|
|
|
|
vec2 stamp_limit = step(abs(local_uv), vec2(1.0));
|
|
|
|
float a = stamp_limit.x*stamp_limit.y;
|
2020-11-08 15:10:46 +01:00
|
|
|
COLOR = pattern_function(0.5*texture_rotation*local_uv2+vec2(0.5)) * vec4(vec3(1.0), brush(0.5*local_uv+vec2(0.5)));
|
2020-10-15 08:47:55 +02:00
|
|
|
}
|