This repository has been archived on 2023-10-09. You can view files and clone it, but cannot push or open issues or pull requests.
Files
blender-archive/source/blender/gpu/shaders/gpu_shader_gpencil_fill_frag.glsl
Antonio Vazquez 66da2f537a New Grease Pencil object for 2D animation
This commit merge the full development done in greasepencil-object branch and include mainly the following features.

- New grease pencil object.
- New drawing engine.
- New grease pencil modes Draw/Sculpt/Edit and Weight Paint.
- New brushes for grease pencil.
- New modifiers for grease pencil.
- New shaders FX.
- New material system (replace old palettes and colors).
- Split of annotations (old grease pencil) and new grease pencil object.
- UI adapted to blender 2.8.

You can get more info here:

https://code.blender.org/2017/12/drawing-2d-animation-in-blender-2-8/
https://code.blender.org/2018/07/grease-pencil-status-update/

This is the result of nearly two years of development and I want thanks firstly the other members of the grease pencil team: Daniel M. Lara, Matias Mendiola and Joshua Leung for their support, ideas and to keep working in the project all the time, without them this project had been impossible.

Also, I want thanks other Blender developers for their help, advices and to be there always to help me, and specially to Clément Foucault, Dalai Felinto, Pablo Vázquez and Campbell Barton.
2018-07-31 10:50:43 +02:00

167 lines
3.5 KiB
GLSL

uniform vec4 color;
uniform vec4 color2;
uniform int fill_type;
uniform float mix_factor;
uniform float g_angle;
uniform float g_radius;
uniform float g_boxsize;
uniform vec2 g_scale;
uniform vec2 g_shift;
uniform float t_angle;
uniform vec2 t_scale;
uniform vec2 t_offset;
uniform int t_mix;
uniform int t_flip;
uniform float t_opacity;
uniform sampler2D myTexture;
/* keep this list synchronized with list in DNA_brush_types.h */
#define SOLID 0
#define GRADIENT 1
#define RADIAL 2
#define CHESS 3
#define TEXTURE 4
in vec2 texCoord_interp;
out vec4 fragColor;
#define texture2D texture
void set_color(in vec4 color, in vec4 color2, in vec4 tcolor, in float mixv, in float factor,
in int tmix, in int flip, out vec4 ocolor)
{
/* full color A */
if (mixv == 1.0) {
if (tmix == 1) {
if (flip == 0) {
ocolor = color;
}
else {
ocolor = tcolor;
}
}
else {
if (flip == 0) {
ocolor = color;
}
else {
ocolor = color2;
}
}
}
/* full color B */
else if (mixv == 0.0) {
if (tmix == 1) {
if (flip == 0) {
ocolor = tcolor;
}
else {
ocolor = color;
}
}
else {
if (flip == 0) {
ocolor = color2;
}
else {
ocolor = color;
}
}
}
/* mix of colors */
else {
if (tmix == 1) {
if (flip == 0) {
ocolor = mix(color, tcolor, factor);
}
else {
ocolor = mix(tcolor, color, factor);
}
}
else {
if (flip == 0) {
ocolor = mix(color, color2, factor);
}
else {
ocolor = mix(color2, color, factor);
}
}
}
}
void main()
{
vec2 t_center = vec2(0.5, 0.5);
mat2 matrot_tex = mat2(cos(t_angle), -sin(t_angle), sin(t_angle), cos(t_angle));
vec2 rot_tex = (matrot_tex * (texCoord_interp - t_center)) + t_center + t_offset;
vec4 tmp_color = texture2D(myTexture, rot_tex * t_scale);
vec4 text_color = vec4(tmp_color[0], tmp_color[1], tmp_color[2], tmp_color[3] * t_opacity);
vec4 chesscolor;
/* solid fill */
if (fill_type == SOLID) {
if (t_mix == 1) {
fragColor = mix(color, text_color, mix_factor);
}
else {
fragColor = color;
}
}
else {
vec2 center = vec2(0.5, 0.5) + g_shift;
mat2 matrot = mat2(cos(g_angle), -sin(g_angle), sin(g_angle), cos(g_angle));
vec2 rot = (((matrot * (texCoord_interp - center)) + center) * g_scale) + g_shift;
/* gradient */
if (fill_type == GRADIENT) {
set_color(color, color2, text_color, mix_factor, rot.x - mix_factor + 0.5, t_mix, t_flip, fragColor);
}
/* radial gradient */
if (fill_type == RADIAL) {
float in_rad = g_radius * mix_factor;
float ex_rad = g_radius - in_rad;
float intensity = 0;
float distance = length((center - texCoord_interp) * g_scale);
if (distance > g_radius) {
discard;
}
if (distance > in_rad) {
intensity = clamp(((distance - in_rad) / ex_rad), 0.0, 1.0);
}
set_color(color, color2, text_color, mix_factor, intensity, t_mix, t_flip, fragColor);
}
/* chessboard */
if (fill_type == CHESS) {
vec2 pos = rot / g_boxsize;
if ((fract(pos.x) < 0.5 && fract(pos.y) < 0.5) || (fract(pos.x) > 0.5 && fract(pos.y) > 0.5)) {
if (t_flip == 0) {
chesscolor = color;
}
else {
chesscolor = color2;
}
}
else {
if (t_flip == 0) {
chesscolor = color2;
}
else {
chesscolor = color;
}
}
/* mix with texture */
if (t_mix == 1) {
fragColor = mix(chesscolor, text_color, mix_factor);
}
else {
fragColor = chesscolor;
}
}
/* texture */
if (fill_type == TEXTURE) {
fragColor = text_color;
}
}
}