material-maker/material_maker/tools/painter/shaders/brush_stamp.shader

37 lines
1.1 KiB
GLSL

#include "brush_common_decl.shader"
GENERATED_CODE
float brush(vec2 uv) {
return clamp(brush_opacity*brush_function(uv)/(1.0-brush_hardness), 0.0, 1.0);
}
void fragment() {
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;
float x = clamp(dot(p-b, bv)/dot(bv, bv), 0.0, 1.0);
vec2 local_uv = p-(b+x*bv);
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 = (0.2+0.8*texture(mask_tex, texture(view2tex_tex, UV).xy).r)*stamp_limit.x*stamp_limit.y;
COLOR = vec4(1.0, 1.0, 1.0, a)*pattern_function(0.5*texture_rotation*local_uv2+vec2(0.5)) * vec4(vec3(1.0), brush(0.5*local_uv+vec2(0.5)));
}