97 lines
3.4 KiB
GLSL
97 lines
3.4 KiB
GLSL
|
|
#include "common_blur.h"
|
|
|
|
varying vec2 v_TexCoord;
|
|
varying vec3 v_Position;
|
|
|
|
uniform vec4 g_BrushPosition; // {"material":"brushposition","default":"0 0"}
|
|
uniform vec4 g_BrushSettings; // {"material":"brushsettings","default":"0 0 0 0"}
|
|
uniform vec4 g_BrushColor; // {"material":"brushcolor","default":"0 0 0"}
|
|
|
|
uniform sampler2D g_Texture0;
|
|
|
|
uniform vec4 g_Texture0Resolution;
|
|
|
|
//uniform vec2 g_TexelSize;
|
|
//uniform vec2 g_TexelSizeHalf;
|
|
|
|
#define BRUSHSIZE g_BrushSettings.x
|
|
|
|
void main() {
|
|
vec4 albedo = CAST4(0);
|
|
albedo.rgb = g_BrushColor;
|
|
|
|
vec2 adjusted = (v_Position.xy - g_BrushPosition.xy) * g_BrushPosition.zw + g_BrushPosition.xy;
|
|
|
|
vec2 texelSize = 1;
|
|
vec4 multiSample = vec4(
|
|
length(vec2(adjusted.x - texelSize.x, adjusted.y - texelSize.y) - g_BrushPosition.xy),
|
|
length(vec2(adjusted.x + texelSize.x, adjusted.y - texelSize.y) - g_BrushPosition.xy),
|
|
length(vec2(adjusted.x + texelSize.x, adjusted.y + texelSize.y) - g_BrushPosition.xy),
|
|
length(vec2(adjusted.x - texelSize.x, adjusted.y + texelSize.y) - g_BrushPosition.xy)
|
|
);
|
|
|
|
float feather = max(0.5f, BRUSHSIZE * 0.5f * (1.0f - g_BrushSettings.y));
|
|
vec4 blend4 = smoothstep(multiSample - feather, multiSample + feather, CAST4(BRUSHSIZE * 0.5f));
|
|
float blend = dot(blend4, CAST4(0.25));
|
|
|
|
float opacity = mix(0.0f, g_BrushSettings.z, blend);
|
|
albedo.a = opacity;
|
|
|
|
#ifdef PINCH
|
|
float pinchSign = albedo.g * 2.0 - 1.0;
|
|
vec2 pinchDelta = ((adjusted - g_BrushPosition.xy) * pinchSign) / BRUSHSIZE;
|
|
float pinchDistance = length(pinchDelta);
|
|
pinchDelta /= pinchDistance;
|
|
pinchDistance = saturate(pinchDistance);
|
|
|
|
vec2 pinchColor = pinchDelta * pinchDistance * 0.5 + 0.5;
|
|
albedo.b = 0.0;
|
|
albedo.rg = mix(vec2(0.5, 0.5), pinchColor, albedo.r);
|
|
#endif
|
|
|
|
#if SPIN
|
|
vec2 positionDelta = ((adjusted - g_BrushPosition.xy)) / BRUSHSIZE;
|
|
positionDelta.y = -positionDelta.y;
|
|
float temp = positionDelta.x;
|
|
positionDelta.x = positionDelta.y;
|
|
positionDelta.y = temp;
|
|
vec2 spinColor = positionDelta * 0.5 + 0.5;
|
|
|
|
albedo.b = 0.0;
|
|
albedo.rg = mix(vec2(0.5, 0.5), spinColor, albedo.r);
|
|
#endif
|
|
|
|
gl_FragColor = albedo;
|
|
|
|
#if BLUR
|
|
// sample weights 3
|
|
// 0.14975490496277529 +
|
|
// 0.23722688396633606 +
|
|
// 0.23722688396633606 +
|
|
// 0.37579132710455257
|
|
// 0.72099
|
|
// (0.27901 / 0.72099)
|
|
// (0.44198 / 0.72099)
|
|
|
|
// ggrid distance
|
|
// sum: 0.318663
|
|
|
|
|
|
vec2 tmpTexel = g_BrushColor.r * 10.0 / g_Texture0Resolution.xy;
|
|
|
|
gl_FragColor.rgb = texSample2D(g_Texture0, v_TexCoord - tmpTexel * vec2((0.123317 / 0.318663), (0.123317 / 0.318663))).rgb * 0.37579132710455257 +
|
|
texSample2D(g_Texture0, v_TexCoord + vec2(tmpTexel.x, -tmpTexel.y) * vec2((0.195346 / 0.318663), (0.123317 / 0.318663))).rgb * 0.23722688396633606 +
|
|
texSample2D(g_Texture0, v_TexCoord + vec2(-tmpTexel.x, tmpTexel.y) * vec2((0.123317 / 0.318663), (0.195346 / 0.318663))).rgb * 0.23722688396633606 +
|
|
texSample2D(g_Texture0, v_TexCoord + tmpTexel * vec2((0.195346 / 0.318663), (0.195346 / 0.318663))).rgb * 0.14975490496277529;
|
|
|
|
//gl_FragColor = texSample2D(g_Texture0, v_TexCoord - tmpTexel) +
|
|
// texSample2D(g_Texture0, v_TexCoord + vec2(tmpTexel.x, -tmpTexel.y)) +
|
|
// texSample2D(g_Texture0, v_TexCoord + vec2(-tmpTexel.x, tmpTexel.y)) +
|
|
// texSample2D(g_Texture0, v_TexCoord + tmpTexel);
|
|
//gl_FragColor *= 0.25;
|
|
|
|
//gl_FragColor.a = 1;
|
|
#endif
|
|
}
|