[Bf-blender-cvs] [1762cd34125] greasepencil-refactor: GPencil: Refactor: Add Weight Paint support

Clément Foucault noreply at git.blender.org
Tue Jan 7 17:42:28 CET 2020


Commit: 1762cd341250e7ea8c1c45bfb957039c5138af38
Author: Clément Foucault
Date:   Tue Jan 7 17:41:07 2020 +0100
Branches: greasepencil-refactor
https://developer.blender.org/rB1762cd341250e7ea8c1c45bfb957039c5138af38

GPencil: Refactor: Add Weight Paint support

===================================================================

M	source/blender/draw/engines/overlay/overlay_gpencil.c
M	source/blender/draw/engines/overlay/shaders/edit_gpencil_vert.glsl
M	source/blender/draw/intern/draw_cache_impl_gpencil.c

===================================================================

diff --git a/source/blender/draw/engines/overlay/overlay_gpencil.c b/source/blender/draw/engines/overlay/overlay_gpencil.c
index ce2866ac7b3..4e45d5f6cad 100644
--- a/source/blender/draw/engines/overlay/overlay_gpencil.c
+++ b/source/blender/draw/engines/overlay/overlay_gpencil.c
@@ -115,8 +115,10 @@ void OVERLAY_edit_gpencil_cache_init(OVERLAY_Data *vedata)
       pd->edit_gpencil_wires_grp = grp = DRW_shgroup_create(sh, psl->edit_gpencil_ps);
       DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
       DRW_shgroup_uniform_bool_copy(grp, "doMultiframe", show_multi_edit_lines);
-      DRW_shgroup_uniform_float_copy(grp, "gpEditOpacity", v3d->vertex_opacity);
+      DRW_shgroup_uniform_bool_copy(grp, "doWeightColor", is_weight_paint);
       DRW_shgroup_uniform_bool_copy(grp, "hideSelect", hide_select);
+      DRW_shgroup_uniform_float_copy(grp, "gpEditOpacity", v3d->vertex_opacity);
+      DRW_shgroup_uniform_texture(grp, "weightTex", G_draw.weight_ramp);
     }
 
     if (show_points && !hide_select) {
@@ -124,7 +126,9 @@ void OVERLAY_edit_gpencil_cache_init(OVERLAY_Data *vedata)
       pd->edit_gpencil_points_grp = grp = DRW_shgroup_create(sh, psl->edit_gpencil_ps);
       DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
       DRW_shgroup_uniform_bool_copy(grp, "doMultiframe", do_multiedit);
+      DRW_shgroup_uniform_bool_copy(grp, "doWeightColor", is_weight_paint);
       DRW_shgroup_uniform_float_copy(grp, "gpEditOpacity", v3d->vertex_opacity);
+      DRW_shgroup_uniform_texture(grp, "weightTex", G_draw.weight_ramp);
     }
   }
 }
@@ -133,9 +137,6 @@ static void OVERLAY_edit_gpencil_cache_populate(OVERLAY_Data *vedata, Object *ob
 {
   OVERLAY_PrivateData *pd = vedata->stl->pd;
   bGPdata *gpd = (bGPdata *)ob->data;
-  if (gpd == NULL) {
-    return;
-  }
 
   if (pd->edit_gpencil_wires_grp) {
     DRWShadingGroup *grp = DRW_shgroup_create_sub(pd->edit_gpencil_wires_grp);
@@ -159,9 +160,6 @@ static void OVERLAY_edit_gpencil_cache_populate(OVERLAY_Data *vedata, Object *ob
 static void OVERLAY_gpencil_color_names(Object *ob)
 {
   bGPdata *gpd = (bGPdata *)ob->data;
-  if (gpd == NULL) {
-    return;
-  }
 
   const DRWContextState *draw_ctx = DRW_context_state_get();
   ViewLayer *view_layer = draw_ctx->view_layer;
@@ -219,7 +217,12 @@ static void OVERLAY_gpencil_color_names(Object *ob)
 
 void OVERLAY_gpencil_cache_populate(OVERLAY_Data *vedata, Object *ob)
 {
-  if (ob->mode == OB_MODE_EDIT_GPENCIL) {
+  bGPdata *gpd = (bGPdata *)ob->data;
+  if (gpd == NULL) {
+    return;
+  }
+
+  if (GPENCIL_ANY_MODE(gpd)) {
     OVERLAY_edit_gpencil_cache_populate(vedata, ob);
   }
 
diff --git a/source/blender/draw/engines/overlay/shaders/edit_gpencil_vert.glsl b/source/blender/draw/engines/overlay/shaders/edit_gpencil_vert.glsl
index ef8febb59c4..cb03ad44615 100644
--- a/source/blender/draw/engines/overlay/shaders/edit_gpencil_vert.glsl
+++ b/source/blender/draw/engines/overlay/shaders/edit_gpencil_vert.glsl
@@ -3,12 +3,15 @@ uniform float normalSize;
 uniform bool doMultiframe;
 uniform bool doStrokeEndpoints;
 uniform bool hideSelect;
+uniform bool doWeightColor;
 uniform float gpEditOpacity;
 uniform vec4 gpEditColor;
+uniform sampler1D weightTex;
 
 in vec3 pos;
 in float ma;
 in uint vflag;
+in float weight;
 
 out vec4 finalColor;
 
@@ -32,6 +35,21 @@ void discard_vert()
 #  define colorSelect (hideSelect ? colorUnselect : colorGpencilVertexSelect)
 #endif
 
+vec3 weight_to_rgb(float t)
+{
+  if (t < 0.0) {
+    /* No weight */
+    return colorUnselect.rgb;
+  }
+  else if (t > 1.0) {
+    /* Error color */
+    return vec3(1.0, 0.0, 1.0);
+  }
+  else {
+    return texture(weightTex, t).rgb;
+  }
+}
+
 void main()
 {
   GPU_INTEL_VERTEX_SHADER_WORKAROUND
@@ -42,13 +60,20 @@ void main()
   bool is_multiframe = (vflag & GP_EDIT_MULTIFRAME) != 0u;
   bool is_stroke_sel = (vflag & GP_EDIT_STROKE_SELECTED) != 0u;
   bool is_point_sel = (vflag & GP_EDIT_POINT_SELECTED) != 0u;
-  finalColor = (is_point_sel) ? colorSelect : colorUnselect;
-  finalColor.a *= gpEditOpacity;
+
+  if (doWeightColor) {
+    finalColor.rgb = weight_to_rgb(weight);
+    finalColor.a = gpEditOpacity;
+  }
+  else {
+    finalColor = (is_point_sel) ? colorSelect : colorUnselect;
+    finalColor.a *= gpEditOpacity;
+  }
 
 #ifdef USE_POINTS
   gl_PointSize = sizeVertex * 2.0;
 
-  if (doStrokeEndpoints) {
+  if (doStrokeEndpoints && !doWeightColor) {
     bool is_stroke_start = (vflag & GP_EDIT_STROKE_START) != 0u;
     bool is_stroke_end = (vflag & GP_EDIT_STROKE_END) != 0u;
 
@@ -62,11 +87,12 @@ void main()
     }
   }
 
-  if (!is_stroke_sel || (!doMultiframe && is_multiframe)) {
+  if ((!is_stroke_sel && !doWeightColor) || (!doMultiframe && is_multiframe)) {
     discard_vert();
   }
 #endif
 
+  /* Discard unwanted padding vertices. */
   if (ma == -1.0 || (is_multiframe && !doMultiframe)) {
     discard_vert();
   }
diff --git a/source/blender/draw/intern/draw_cache_impl_gpencil.c b/source/blender/draw/intern/draw_cache_impl_gpencil.c
index 09a61ffe509..ddd93ad8636 100644
--- a/source/blender/draw/intern/draw_cache_impl_gpencil.c
+++ b/source/blender/draw/intern/draw_cache_impl_gpencil.c
@@ -555,7 +555,7 @@ static uint32_t gpencil_point_edit_flag(const bGPDspoint *pt, int v, int v_len)
 
 static float gpencil_point_edit_weight(const MDeformVert *dvert, int v, int vgindex)
 {
-  return (dvert && dvert->dw) ? defvert_find_weight(&dvert[v], vgindex) : 0.0f;
+  return (dvert && dvert->dw) ? defvert_find_weight(&dvert[v], vgindex) : -1.0f;
 }
 
 static void gpencil_edit_stroke_iter_cb(bGPDlayer *UNUSED(gpl),



More information about the Bf-blender-cvs mailing list