GPencil: Add option to mix color with texture
[blender.git] / source / blender / draw / engines / gpencil / shaders / gpencil_point_frag.glsl
1 uniform int color_type;
2 uniform int mode;
3 uniform sampler2D myTexture;
4
5 uniform float gradient_f;
6 uniform vec2 gradient_s;
7
8 uniform vec4 colormix;
9 uniform float mix_stroke_factor;
10
11 in vec4 mColor;
12 in vec2 mTexCoord;
13 out vec4 fragColor;
14
15 #define texture2D texture
16
17 #define GPENCIL_MODE_LINE 0
18 #define GPENCIL_MODE_DOTS 1
19 #define GPENCIL_MODE_BOX 2
20
21 /* keep this list synchronized with list in gpencil_engine.h */
22 #define GPENCIL_COLOR_SOLID 0
23 #define GPENCIL_COLOR_TEXTURE 1
24 #define GPENCIL_COLOR_PATTERN 2
25
26 /* Function to check the point inside ellipse */
27 float checkpoint(vec2 pt, vec2 radius)
28 {
29   float p = (pow(pt.x, 2) / pow(radius.x, 2)) + (pow(pt.y, 2) / pow(radius.y, 2));
30
31   return p;
32 }
33
34 void main()
35 {
36   vec2 centered = mTexCoord - vec2(0.5);
37   float ellip = checkpoint(centered, vec2(gradient_s / 2.0));
38
39   if (mode != GPENCIL_MODE_BOX) {
40     if (ellip > 1.0) {
41       discard;
42     }
43   }
44
45   vec4 tmp_color = texture2D(myTexture, mTexCoord);
46
47   /* Solid */
48   if (color_type == GPENCIL_COLOR_SOLID) {
49     fragColor = mColor;
50   }
51   /* texture */
52   if (color_type == GPENCIL_COLOR_TEXTURE) {
53     vec4 text_color = texture2D(myTexture, mTexCoord);
54     if (mix_stroke_factor > 0.0) {
55       fragColor.rgb = mix(text_color.rgb, colormix.rgb, mix_stroke_factor);
56       fragColor.a = text_color.a;
57     }
58     else {
59       fragColor = text_color;
60     }
61
62     /* mult both alpha factor to use strength factor with texture */
63     fragColor.a = min(fragColor.a * mColor.a, fragColor.a);
64   }
65   /* pattern */
66   if (color_type == GPENCIL_COLOR_PATTERN) {
67     vec4 text_color = texture2D(myTexture, mTexCoord);
68     fragColor = mColor;
69     /* mult both alpha factor to use strength factor with color alpha limit */
70     fragColor.a = min(text_color.a * mColor.a, mColor.a);
71   }
72
73   if ((mode == GPENCIL_MODE_DOTS) && (gradient_f < 1.0)) {
74     float dist = length(centered) * 2;
75     float decay = dist * (1.0 - gradient_f) * fragColor.a;
76     fragColor.a = clamp(fragColor.a - decay, 0.0, 1.0);
77     fragColor.a = fragColor.a * (1.0 - ellip);
78   }
79
80   if (fragColor.a < 0.0035) {
81     discard;
82   }
83 }