Cleanup: clang-format
[blender.git] / source / blender / draw / engines / gpencil / shaders / gpencil_blend_frag.glsl
1 in vec4 uvcoordsvar;
2
3 out vec4 FragColor;
4
5 uniform sampler2D strokeColor;
6 uniform sampler2D strokeDepth;
7 uniform sampler2D blendColor;
8 uniform sampler2D blendDepth;
9 uniform int mode;
10 uniform int clamp_layer;
11 uniform float blend_opacity;
12 uniform int tonemapping;
13
14 #define ON 1
15 #define OFF 0
16
17 #define MODE_REGULAR 0
18 #define MODE_OVERLAY 1
19 #define MODE_ADD 2
20 #define MODE_SUB 3
21 #define MODE_MULTIPLY 4
22 #define MODE_DIVIDE 5
23
24 float overlay_color(float a, float b)
25 {
26   float rtn;
27   if (a < 0.5) {
28     rtn = 2.0 * a * b;
29   }
30   else {
31     rtn = 1.0 - 2.0 * (1.0 - a) * (1.0 - b);
32   }
33
34   return rtn;
35 }
36
37 vec4 get_blend_color(int mode, vec4 src_color, vec4 blend_color)
38 {
39   vec4 mix_color = blend_color;
40   vec4 outcolor;
41
42   if (mix_color.a == 0) {
43     outcolor = src_color;
44   }
45   else if (mode == MODE_OVERLAY) {
46     mix_color.rgb = mix(src_color.rgb, mix_color.rgb, mix_color.a * blend_opacity);
47     outcolor.r = overlay_color(src_color.r, mix_color.r);
48     outcolor.g = overlay_color(src_color.g, mix_color.g);
49     outcolor.b = overlay_color(src_color.b, mix_color.b);
50     outcolor.a = src_color.a;
51   }
52   else if (mode == MODE_ADD) {
53     mix_color.rgb = mix(src_color.rgb, mix_color.rgb, mix_color.a * blend_opacity);
54     outcolor = src_color + mix_color;
55     outcolor.a = src_color.a;
56   }
57   else if (mode == MODE_SUB) {
58     mix_color.rgb = mix(src_color.rgb, mix_color.rgb, mix_color.a * blend_opacity);
59     outcolor = src_color - mix_color;
60     outcolor.a = clamp(src_color.a - (mix_color.a * blend_opacity), 0.0, 1.0);
61   }
62   else if (mode == MODE_MULTIPLY) {
63     mix_color.rgb = mix(src_color.rgb, mix_color.rgb, mix_color.a * blend_opacity);
64     outcolor = src_color * mix_color;
65     outcolor.a = src_color.a;
66   }
67   else if (mode == MODE_DIVIDE) {
68     mix_color.rgb = mix(src_color.rgb, mix_color.rgb, mix_color.a * blend_opacity);
69     outcolor = src_color / mix_color;
70     outcolor.a = src_color.a;
71   }
72   else {
73     outcolor = mix_color * blend_opacity;
74     outcolor.a = src_color.a;
75   }
76
77   return clamp(outcolor, 0.0, 1.0);
78 }
79
80 float linearrgb_to_srgb(float c)
81 {
82   if (c < 0.0031308) {
83     return (c < 0.0) ? 0.0 : c * 12.92;
84   }
85   else {
86     return 1.055 * pow(c, 1.0 / 2.4) - 0.055;
87   }
88 }
89
90 vec4 tone(vec4 stroke_color)
91 {
92   if (tonemapping == 1) {
93     vec4 color = vec4(0, 0, 0, stroke_color.a);
94     color.r = linearrgb_to_srgb(stroke_color.r);
95     color.g = linearrgb_to_srgb(stroke_color.g);
96     color.b = linearrgb_to_srgb(stroke_color.b);
97     return color;
98   }
99   else {
100     return stroke_color;
101   }
102 }
103
104 void main()
105 {
106   vec4 outcolor;
107   ivec2 uv = ivec2(gl_FragCoord.xy);
108   vec4 stroke_color = texelFetch(strokeColor, uv, 0).rgba;
109   float stroke_depth = texelFetch(strokeDepth, uv, 0).r;
110
111   vec4 mix_color = texelFetch(blendColor, uv, 0).rgba;
112   float mix_depth = texelFetch(blendDepth, uv, 0).r;
113
114   /* Default mode */
115   if (mode == MODE_REGULAR) {
116     if (stroke_color.a > 0) {
117       if (mix_color.a > 0) {
118         /* premult */
119         stroke_color = vec4(vec3(stroke_color.rgb / stroke_color.a), stroke_color.a);
120         mix_color = vec4(vec3(mix_color.rgb / mix_color.a), mix_color.a);
121
122         FragColor = vec4(mix(stroke_color.rgb, mix_color.rgb, mix_color.a), stroke_color.a);
123         gl_FragDepth = mix_depth;
124       }
125       else {
126         FragColor = stroke_color;
127         gl_FragDepth = stroke_depth;
128       }
129     }
130     else {
131       if (clamp_layer == ON) {
132         discard;
133       }
134       else {
135         FragColor = mix_color;
136         gl_FragDepth = mix_depth;
137       }
138     }
139     FragColor = tone(FragColor);
140     return;
141   }
142
143   /* if not using mask, return mix color */
144   if ((stroke_color.a == 0) && (clamp_layer == OFF)) {
145     FragColor = tone(mix_color);
146     gl_FragDepth = mix_depth;
147     return;
148   }
149
150   /* apply blend mode */
151   FragColor = tone(get_blend_color(mode, stroke_color, mix_color));
152   gl_FragDepth = stroke_depth;
153 }