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

47 lines
1.6 KiB
Plaintext
Raw Normal View History

shader_type canvas_item;
uniform vec2 brush_pos = vec2(0.5, 0.5);
uniform vec2 brush_ppos = vec2(0.5, 0.5);
uniform vec2 brush_size = vec2(0.25, 0.25);
uniform float brush_hardness = 0.5;
const float brush_opacity = 1.0;
uniform float stroke_length = 0.0;
uniform float stroke_angle = 0.0;
2020-10-17 21:04:19 +02:00
uniform float pattern_scale = 10.0;
2020-10-22 07:41:38 +02:00
uniform float pattern_angle = 0.0;
uniform float pressure = 1.0;
uniform sampler2D mesh_normal_tex;
uniform sampler2D layer_albedo_tex;
uniform sampler2D layer_mr_tex;
uniform sampler2D layer_emission_tex;
uniform sampler2D layer_depth_tex;
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-17 21:04:19 +02:00
vec4 pattern_function(vec2 uv) {
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
float brush(vec2 uv) {
return clamp(brush_opacity*brush_function(uv)/(1.0-brush_hardness), 0.0, 1.0);
}
void fragment() {
vec2 b = brush_pos/brush_size;
vec2 bv = (brush_ppos-brush_pos)/brush_size;
vec2 p = UV/brush_size;
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 = stamp_limit.x*stamp_limit.y;
COLOR = pattern_function(0.5*texture_rotation*local_uv2+vec2(0.5)) * vec4(vec3(1.0), brush(0.5*local_uv+vec2(0.5)));
}