[Bf-blender-cvs] [ae529faa87e] greasepencil-refactor: GPencil: Refactor: Add back guides and control points overlays

Clément Foucault noreply at git.blender.org
Thu Jan 9 17:53:01 CET 2020


Commit: ae529faa87e4feb24213499d94c311980f66ba34
Author: Clément Foucault
Date:   Thu Jan 9 17:52:49 2020 +0100
Branches: greasepencil-refactor
https://developer.blender.org/rBae529faa87e4feb24213499d94c311980f66ba34

GPencil: Refactor: Add back guides and control points overlays

This use a special shader to draw points using uniforms. This is to avoid
creating a batch for each frame.

This is ok since the number of points is really low.

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/overlay/overlay_gpencil.c
M	source/blender/draw/engines/overlay/overlay_private.h
M	source/blender/draw/engines/overlay/overlay_shader.c
A	source/blender/draw/engines/overlay/shaders/edit_gpencil_guide_vert.glsl

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 1c641fb835b..95091ed85b8 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -314,8 +314,9 @@ data_to_c_simple(engines/overlay/shaders/edit_curve_handle_geom.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/edit_curve_handle_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/edit_curve_point_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/edit_curve_wire_vert.glsl SRC)
-data_to_c_simple(engines/overlay/shaders/edit_gpencil_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/edit_gpencil_canvas_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/edit_gpencil_guide_vert.glsl SRC)
+data_to_c_simple(engines/overlay/shaders/edit_gpencil_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/edit_lattice_point_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/edit_lattice_wire_vert.glsl SRC)
 data_to_c_simple(engines/overlay/shaders/edit_mesh_common_lib.glsl SRC)
diff --git a/source/blender/draw/engines/overlay/overlay_gpencil.c b/source/blender/draw/engines/overlay/overlay_gpencil.c
index 310c8b4031a..ae8e4aa65ac 100644
--- a/source/blender/draw/engines/overlay/overlay_gpencil.c
+++ b/source/blender/draw/engines/overlay/overlay_gpencil.c
@@ -128,6 +128,45 @@ void OVERLAY_edit_gpencil_cache_init(OVERLAY_Data *vedata)
       DRW_shgroup_uniform_texture(grp, "weightTex", G_draw.weight_ramp);
     }
   }
+
+  if (gpd->runtime.cp_points || ts->gp_sculpt.guide.use_guide) {
+    DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA;
+    DRW_PASS_CREATE(psl->edit_gpencil_gizmos_ps, state);
+
+    sh = OVERLAY_shader_edit_gpencil_guide_point();
+    grp = DRW_shgroup_create(sh, psl->edit_gpencil_gizmos_ps);
+
+    if (gpd->runtime.cp_points != NULL) {
+      for (int i = 0; i < gpd->runtime.tot_cp_points; i++) {
+        bGPDcontrolpoint *cp = &gpd->runtime.cp_points[i];
+        grp = DRW_shgroup_create_sub(grp);
+        DRW_shgroup_uniform_vec3_copy(grp, "pPosition", &cp->x);
+        DRW_shgroup_uniform_float_copy(grp, "pSize", cp->size * 0.8f * G_draw.block.sizePixel);
+        DRW_shgroup_uniform_vec4_copy(grp, "pColor", cp->color);
+        DRW_shgroup_call_procedural_points(grp, NULL, 1);
+      }
+    }
+
+    if (ts->gp_sculpt.guide.use_guide) {
+      float color[4];
+      if (ts->gp_sculpt.guide.reference_point == GP_GUIDE_REF_CUSTOM) {
+        UI_GetThemeColor4fv(TH_GIZMO_PRIMARY, color);
+        DRW_shgroup_uniform_vec3_copy(grp, "pPosition", ts->gp_sculpt.guide.location);
+      }
+      else if (ts->gp_sculpt.guide.reference_point == GP_GUIDE_REF_OBJECT &&
+               ts->gp_sculpt.guide.reference_object != NULL) {
+        UI_GetThemeColor4fv(TH_GIZMO_SECONDARY, color);
+        DRW_shgroup_uniform_vec3_copy(grp, "pPosition", ts->gp_sculpt.guide.reference_object->loc);
+      }
+      else {
+        UI_GetThemeColor4fv(TH_REDALERT, color);
+        DRW_shgroup_uniform_vec3_copy(grp, "pPosition", scene->cursor.location);
+      }
+      DRW_shgroup_uniform_vec4_copy(grp, "pColor", color);
+      DRW_shgroup_uniform_float_copy(grp, "pSize", 8.0f * G_draw.block.sizePixel);
+      DRW_shgroup_call_procedural_points(grp, NULL, 1);
+    }
+  }
 }
 
 void OVERLAY_gpencil_cache_init(OVERLAY_Data *vedata)
@@ -328,6 +367,10 @@ void OVERLAY_edit_gpencil_draw(OVERLAY_Data *vedata)
 {
   OVERLAY_PassList *psl = vedata->psl;
 
+  if (psl->edit_gpencil_gizmos_ps) {
+    DRW_draw_pass(psl->edit_gpencil_gizmos_ps);
+  }
+
   if (psl->edit_gpencil_ps) {
     DRW_draw_pass(psl->edit_gpencil_ps);
   }
diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h
index 56f395ace5c..b63a9c0d7e2 100644
--- a/source/blender/draw/engines/overlay/overlay_private.h
+++ b/source/blender/draw/engines/overlay/overlay_private.h
@@ -58,6 +58,7 @@ typedef struct OVERLAY_PassList {
   DRWPass *edit_curve_wire_ps[2];
   DRWPass *edit_curve_handle_ps;
   DRWPass *edit_gpencil_ps;
+  DRWPass *edit_gpencil_gizmos_ps;
   DRWPass *edit_lattice_ps;
   DRWPass *edit_mesh_depth_ps[2];
   DRWPass *edit_mesh_verts_ps[2];
@@ -540,6 +541,7 @@ GPUShader *OVERLAY_shader_depth_only(void);
 GPUShader *OVERLAY_shader_edit_curve_handle(void);
 GPUShader *OVERLAY_shader_edit_curve_point(void);
 GPUShader *OVERLAY_shader_edit_curve_wire(void);
+GPUShader *OVERLAY_shader_edit_gpencil_guide_point(void);
 GPUShader *OVERLAY_shader_edit_gpencil_point(void);
 GPUShader *OVERLAY_shader_edit_gpencil_wire(void);
 GPUShader *OVERLAY_shader_edit_lattice_point(void);
diff --git a/source/blender/draw/engines/overlay/overlay_shader.c b/source/blender/draw/engines/overlay/overlay_shader.c
index db3611671c5..450fbc5d8bb 100644
--- a/source/blender/draw/engines/overlay/overlay_shader.c
+++ b/source/blender/draw/engines/overlay/overlay_shader.c
@@ -52,8 +52,9 @@ extern char datatoc_edit_curve_handle_geom_glsl[];
 extern char datatoc_edit_curve_handle_vert_glsl[];
 extern char datatoc_edit_curve_point_vert_glsl[];
 extern char datatoc_edit_curve_wire_vert_glsl[];
-extern char datatoc_edit_gpencil_vert_glsl[];
 extern char datatoc_edit_gpencil_canvas_vert_glsl[];
+extern char datatoc_edit_gpencil_guide_vert_glsl[];
+extern char datatoc_edit_gpencil_vert_glsl[];
 extern char datatoc_edit_lattice_point_vert_glsl[];
 extern char datatoc_edit_lattice_wire_vert_glsl[];
 extern char datatoc_edit_mesh_common_lib_glsl[];
@@ -137,6 +138,7 @@ typedef struct OVERLAY_Shaders {
   GPUShader *edit_curve_handle;
   GPUShader *edit_curve_point;
   GPUShader *edit_curve_wire;
+  GPUShader *edit_gpencil_guide_point;
   GPUShader *edit_gpencil_point;
   GPUShader *edit_gpencil_wire;
   GPUShader *edit_lattice_point;
@@ -534,6 +536,20 @@ GPUShader *OVERLAY_shader_edit_curve_wire(void)
   return sh_data->edit_curve_wire;
 }
 
+GPUShader *OVERLAY_shader_edit_gpencil_guide_point(void)
+{
+  OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
+  if (!sh_data->edit_gpencil_guide_point) {
+    sh_data->edit_gpencil_guide_point = GPU_shader_create_from_arrays({
+        .vert = (const char *[]){datatoc_common_view_lib_glsl,
+                                 datatoc_edit_gpencil_guide_vert_glsl,
+                                 NULL},
+        .frag = (const char *[]){datatoc_gpu_shader_point_varying_color_frag_glsl, NULL},
+    });
+  }
+  return sh_data->edit_gpencil_guide_point;
+}
+
 GPUShader *OVERLAY_shader_edit_gpencil_point(void)
 {
   const DRWContextState *draw_ctx = DRW_context_state_get();
diff --git a/source/blender/draw/engines/overlay/shaders/edit_gpencil_guide_vert.glsl b/source/blender/draw/engines/overlay/shaders/edit_gpencil_guide_vert.glsl
new file mode 100644
index 00000000000..ef68b0f4e6f
--- /dev/null
+++ b/source/blender/draw/engines/overlay/shaders/edit_gpencil_guide_vert.glsl
@@ -0,0 +1,14 @@
+uniform vec4 pColor;
+uniform float pSize;
+uniform vec3 pPosition;
+
+out vec4 finalColor;
+
+void main()
+{
+  GPU_INTEL_VERTEX_SHADER_WORKAROUND
+
+  gl_Position = point_world_to_ndc(pPosition);
+  finalColor = pColor;
+  gl_PointSize = pSize;
+}



More information about the Bf-blender-cvs mailing list