[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