[Bf-blender-cvs] [985a9dba61d] greasepencil-refactor: GPencil: Refactor: Add basic vertex color support
Clément Foucault
noreply at git.blender.org
Wed Dec 11 13:48:57 CET 2019
Commit: 985a9dba61dca3884cfbfcb01060d0fae6431399
Author: Clément Foucault
Date: Wed Dec 11 14:20:09 2019 +0100
Branches: greasepencil-refactor
https://developer.blender.org/rB985a9dba61dca3884cfbfcb01060d0fae6431399
GPencil: Refactor: Add basic vertex color support
===================================================================
M source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
M source/blender/draw/engines/gpencil/shaders/gpencil_vert.glsl
===================================================================
diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
index fea053d1e1b..2d6c64bdd70 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
@@ -70,19 +70,19 @@ typedef struct gpStrokeVert {
int mat;
/** Position and thickness packed in the same attribute. */
float pos[3], thickness;
- // float col[4];
- float uv[2];
+ float col[4];
+ /** UV and strength packed in the same attribute. */
+ float uv[2], strength;
} gpStrokeVert;
static GPUVertFormat *gpencil_stroke_format(void)
{
static GPUVertFormat format = {0};
if (format.attr_len == 0) {
- /* TODO Try reducing format size. */
GPU_vertformat_attr_add(&format, "ma", GPU_COMP_I32, 1, GPU_FETCH_INT);
GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
- // GPU_vertformat_attr_add(&format, "col", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
- GPU_vertformat_attr_add(&format, "uv", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+ GPU_vertformat_attr_add(&format, "col", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
+ GPU_vertformat_attr_add(&format, "uv", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
/* IMPORTANT: This means having only 4 attributes to fit into opengl limit of 16 attrib. */
GPU_vertformat_multiload_enable(&format, 4);
}
@@ -113,9 +113,10 @@ static void gpencil_buffer_add_point(gpStrokeVert *verts,
const bGPDspoint *pt,
bool is_endpoint)
{
- /* TODO other attribs */
copy_v3_v3(verts->pos, &pt->x);
copy_v2_v2(verts->uv, pt->uv_fill);
+ copy_v4_v4(verts->col, pt->mix_color);
+ verts->strength = pt->strength;
verts->thickness = gps->thickness * pt->pressure;
/* Tag endpoint material to -1 so they get discarded by vertex shader. */
verts->mat = (is_endpoint) ? -1 : (gps->mat_nr % GPENCIL_MATERIAL_BUFFER_LEN);
diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_vert.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_vert.glsl
index 3af0f1d7d33..051c84ca9a1 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_vert.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_vert.glsl
@@ -20,8 +20,11 @@ in vec4 pos1; /* Current edge */
in vec4 pos2; /* Current edge */
in vec4 pos3; /* Next adj vert */
-in vec2 uv1;
-in vec2 uv2;
+in vec3 uv1;
+in vec3 uv2;
+
+in vec4 col1;
+in vec4 col2;
out vec4 finalColor;
out vec2 finalUvs;
@@ -127,10 +130,15 @@ void stroke_vertex()
gl_Position.xy += miter * sizeViewportInv.xy * y;
- finalColor = materials[ma1].stroke_color;
+ vec4 vert_col = (x == 0.0) ? col1 : col2;
+ float vert_strength = (x == 0.0) ? uv1.z : uv2.z;
+ vec4 stroke_col = materials[ma1].stroke_color;
+ finalColor.rgb = mix(stroke_col.rgb, vert_col.rgb, vert_col.a);
+ finalColor.a = clamp(stroke_col.a * vert_strength, 0.0, 1.0);
+ // finalColor *= vert_col;
finalMixColor = vec4(0.0);
matFlag = materials[ma1].flag & ~GP_FILL_FLAGS;
- finalUvs = (x == 0.0) ? uv1 : uv2;
+ finalUvs = (x == 0.0) ? uv1.xy : uv2.xy;
}
void dots_vertex()
@@ -153,7 +161,7 @@ void fill_vertex()
vec2 loc = materials[ma1].fill_uv_offset.xy;
mat2x2 rot_scale = mat2x2(materials[ma1].fill_uv_rot_scale.xy,
materials[ma1].fill_uv_rot_scale.zw);
- finalUvs = rot_scale * uv1 + loc;
+ finalUvs = rot_scale * uv1.xy + loc;
}
void main()
More information about the Bf-blender-cvs
mailing list