[Bf-blender-cvs] [3b27d75f451] greasepencil-refactor: GPencil: Refactor: Add canvas grid

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


Commit: 3b27d75f45188a9fb6f70ac73d3ca6dc14311512
Author: Clément Foucault
Date:   Tue Jan 7 20:15:34 2020 +0100
Branches: greasepencil-refactor
https://developer.blender.org/rB3b27d75f45188a9fb6f70ac73d3ca6dc14311512

GPencil: Refactor: Add canvas grid

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/overlay/overlay_engine.c
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_canvas_vert.glsl

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 46211eefe87..23516f5067f 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -347,6 +347,7 @@ 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_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_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c
index ac8af115500..1abd6ff459d 100644
--- a/source/blender/draw/engines/overlay/overlay_engine.c
+++ b/source/blender/draw/engines/overlay/overlay_engine.c
@@ -152,6 +152,7 @@ static void OVERLAY_cache_init(void *vedata)
   OVERLAY_armature_cache_init(vedata);
   OVERLAY_extra_cache_init(vedata);
   OVERLAY_facing_cache_init(vedata);
+  OVERLAY_gpencil_cache_init(vedata);
   OVERLAY_grid_cache_init(vedata);
   OVERLAY_image_cache_init(vedata);
   OVERLAY_metaball_cache_init(vedata);
@@ -394,6 +395,7 @@ static void OVERLAY_draw_scene(void *vedata)
   OVERLAY_armature_draw(vedata);
   OVERLAY_particle_draw(vedata);
   OVERLAY_metaball_draw(vedata);
+  OVERLAY_gpencil_draw(vedata);
   OVERLAY_extra_draw(vedata);
 
   if (DRW_state_is_fbo()) {
diff --git a/source/blender/draw/engines/overlay/overlay_gpencil.c b/source/blender/draw/engines/overlay/overlay_gpencil.c
index 83fce819151..f8d03f171b6 100644
--- a/source/blender/draw/engines/overlay/overlay_gpencil.c
+++ b/source/blender/draw/engines/overlay/overlay_gpencil.c
@@ -58,9 +58,10 @@ void OVERLAY_edit_gpencil_cache_init(OVERLAY_Data *vedata)
   View3D *v3d = draw_ctx->v3d;
   Object *ob = draw_ctx->obact;
   bGPdata *gpd = (bGPdata *)ob->data;
-  ToolSettings *ts = draw_ctx->scene->toolsettings;
+  Scene *scene = draw_ctx->scene;
+  ToolSettings *ts = scene->toolsettings;
 
-  if (gpd == NULL) {
+  if (ob->type != OB_GPENCIL || gpd == NULL) {
     return;
   }
 
@@ -101,11 +102,7 @@ void OVERLAY_edit_gpencil_cache_init(OVERLAY_Data *vedata)
                            (GPENCIL_EDIT_MODE(gpd) &&
                             (ts->gpencil_selectmode_edit != GP_SELECTMODE_STROKE));
 
-  if (GPENCIL_VERTEX_MODE(gpd) && !use_vertex_mask && !show_multi_edit_lines) {
-    return;
-  }
-
-  {
+  if (!GPENCIL_VERTEX_MODE(gpd) || use_vertex_mask || show_multi_edit_lines) {
     DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL |
                      DRW_STATE_BLEND_ALPHA;
     DRW_PASS_CREATE(psl->edit_gpencil_ps, state | pd->clipping_state);
@@ -133,6 +130,92 @@ void OVERLAY_edit_gpencil_cache_init(OVERLAY_Data *vedata)
   }
 }
 
+void OVERLAY_gpencil_cache_init(OVERLAY_Data *vedata)
+{
+  OVERLAY_PassList *psl = vedata->psl;
+  struct GPUShader *sh;
+  DRWShadingGroup *grp;
+
+  /* Default: Display nothing. */
+  psl->gpencil_canvas_ps = NULL;
+
+  /* REFACTOR(fclem) remove */
+  if (G.debug_value != 50) {
+    return;
+  }
+
+  const DRWContextState *draw_ctx = DRW_context_state_get();
+  View3D *v3d = draw_ctx->v3d;
+  Object *ob = draw_ctx->obact;
+  bGPdata *gpd = (bGPdata *)ob->data;
+  Scene *scene = draw_ctx->scene;
+  ToolSettings *ts = scene->toolsettings;
+  const View3DCursor *cursor = &scene->cursor;
+
+  if (ob->type != OB_GPENCIL || gpd == NULL) {
+    return;
+  }
+
+  const bool show_overlays = (v3d->flag2 & V3D_HIDE_OVERLAYS) == 0;
+  const bool show_grid = (v3d->gp_flag & V3D_GP_SHOW_GRID) != 0;
+
+  if (show_grid && show_overlays) {
+    const char *grid_unit = NULL;
+    float mat[4][4];
+    float col_grid[4];
+    float size[2];
+
+    /* set color */
+    copy_v3_v3(col_grid, gpd->grid.color);
+    col_grid[3] = max_ff(v3d->overlay.gpencil_grid_opacity, 0.01f);
+
+    copy_m4_m4(mat, ob->obmat);
+
+    float viewinv[4][4];
+    /* Set the grid in the selected axis */
+    switch (ts->gp_sculpt.lock_axis) {
+      case GP_LOCKAXIS_X:
+        swap_v4_v4(mat[0], mat[2]);
+        break;
+      case GP_LOCKAXIS_Y:
+        swap_v4_v4(mat[1], mat[2]);
+        break;
+      case GP_LOCKAXIS_Z:
+        /* Default. */
+        break;
+      case GP_LOCKAXIS_CURSOR:
+        loc_eul_size_to_mat4(mat, cursor->location, cursor->rotation_euler, (float[3]){1, 1, 1});
+        break;
+      case GP_LOCKAXIS_VIEW:
+        /* view aligned */
+        DRW_view_viewmat_get(NULL, viewinv, true);
+        copy_v3_v3(mat[0], viewinv[0]);
+        copy_v3_v3(mat[1], viewinv[1]);
+        break;
+    }
+
+    translate_m4(mat, gpd->grid.offset[0], gpd->grid.offset[1], 0.0f);
+    mul_v2_v2fl(size, gpd->grid.scale, 2.0f * ED_scene_grid_scale(scene, &grid_unit));
+    rescale_m4(mat, (float[3]){size[0], size[1], 0.0f});
+
+    const int gridlines = (gpd->grid.lines <= 0) ? 1 : gpd->grid.lines;
+    int line_ct = gridlines * 4 + 2;
+
+    DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_BLEND_ALPHA;
+    DRW_PASS_CREATE(psl->gpencil_canvas_ps, state);
+
+    sh = OVERLAY_shader_gpencil_canvas();
+    grp = DRW_shgroup_create(sh, psl->gpencil_canvas_ps);
+    DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
+    DRW_shgroup_uniform_vec4_copy(grp, "color", col_grid);
+    DRW_shgroup_uniform_vec3_copy(grp, "xAxis", mat[0]);
+    DRW_shgroup_uniform_vec3_copy(grp, "yAxis", mat[1]);
+    DRW_shgroup_uniform_vec3_copy(grp, "origin", mat[3]);
+    DRW_shgroup_uniform_int_copy(grp, "halfLineCount", line_ct / 2);
+    DRW_shgroup_call_procedural_lines(grp, NULL, line_ct);
+  }
+}
+
 static void OVERLAY_edit_gpencil_cache_populate(OVERLAY_Data *vedata, Object *ob)
 {
   OVERLAY_PrivateData *pd = vedata->stl->pd;
@@ -236,6 +319,15 @@ void OVERLAY_gpencil_cache_populate(OVERLAY_Data *vedata, Object *ob)
   }
 }
 
+void OVERLAY_gpencil_draw(OVERLAY_Data *vedata)
+{
+  OVERLAY_PassList *psl = vedata->psl;
+
+  if (psl->gpencil_canvas_ps) {
+    DRW_draw_pass(psl->gpencil_canvas_ps);
+  }
+}
+
 void OVERLAY_edit_gpencil_draw(OVERLAY_Data *vedata)
 {
   OVERLAY_PassList *psl = vedata->psl;
diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h
index 6ca06d63055..56f395ace5c 100644
--- a/source/blender/draw/engines/overlay/overlay_private.h
+++ b/source/blender/draw/engines/overlay/overlay_private.h
@@ -74,6 +74,7 @@ typedef struct OVERLAY_PassList {
   DRWPass *extra_blend_ps;
   DRWPass *extra_centers_ps;
   DRWPass *extra_grid_ps;
+  DRWPass *gpencil_canvas_ps;
   DRWPass *facing_ps;
   DRWPass *grid_ps;
   DRWPass *image_background_under_ps;
@@ -410,7 +411,9 @@ void OVERLAY_edit_surf_cache_populate(OVERLAY_Data *vedata, Object *ob);
 void OVERLAY_edit_curve_draw(OVERLAY_Data *vedata);
 
 void OVERLAY_edit_gpencil_cache_init(OVERLAY_Data *vedata);
+void OVERLAY_gpencil_cache_init(OVERLAY_Data *vedata);
 void OVERLAY_gpencil_cache_populate(OVERLAY_Data *vedata, Object *ob);
+void OVERLAY_gpencil_draw(OVERLAY_Data *vedata);
 void OVERLAY_edit_gpencil_draw(OVERLAY_Data *vedata);
 
 void OVERLAY_edit_lattice_cache_init(OVERLAY_Data *vedata);
@@ -556,6 +559,7 @@ GPUShader *OVERLAY_shader_extra_wire(bool use_object);
 GPUShader *OVERLAY_shader_extra_loose_point(void);
 GPUShader *OVERLAY_shader_extra_point(void);
 GPUShader *OVERLAY_shader_facing(void);
+GPUShader *OVERLAY_shader_gpencil_canvas(void);
 GPUShader *OVERLAY_shader_grid(void);
 GPUShader *OVERLAY_shader_image(void);
 GPUShader *OVERLAY_shader_motion_path_line(void);
diff --git a/source/blender/draw/engines/overlay/overlay_shader.c b/source/blender/draw/engines/overlay/overlay_shader.c
index 7fe62c471d0..1d906a6fc38 100644
--- a/source/blender/draw/engines/overlay/overlay_shader.c
+++ b/source/blender/draw/engines/overlay/overlay_shader.c
@@ -53,6 +53,7 @@ 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_lattice_point_vert_glsl[];
 extern char datatoc_edit_lattice_wire_vert_glsl[];
 extern char datatoc_edit_mesh_common_lib_glsl[];
@@ -159,6 +160,7 @@ typedef struct OVERLAY_Shaders {
   GPUShader *extra_lightprobe_grid;
   GPUShader *extra_loose_point;
   GPUShader *facing;
+  GPUShader *gpencil_canvas;
   GPUShader *grid;
   GPUShader *image;
   GPUShader *motion_path_line;
@@ -896,6 +898,21 @@ GPUShader *OVERLAY_shader_facing(void)
   return sh_data->facing;
 }
 
+GPUShader *OVERLAY_shader_gpencil_canvas(void)
+{
+  OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
+  if (!sh_data->gpencil_canvas) {
+    sh_data->gpencil_canvas = GPU_shader_create_from_arrays({
+        .vert = (const char *[]){datatoc_common_globals_lib_glsl,
+                                 datatoc_common_view_lib_glsl,
+                                 datatoc_edit_gpencil_canvas_vert_glsl,
+                                 NULL},
+        .frag = (const char *[]){datatoc_common_view_lib_glsl, datatoc_extra_frag_glsl, NULL},
+    });
+  }
+  return sh_data->gpencil_canvas;
+}
+
 GPUShader *OVERLAY_shader_grid(void)
 {
   OVERLAY_Shaders *sh_data = &e_data.sh_data[0];
diff --git a/source/blender/draw/engines/overlay/shaders/edit_gpencil_canvas_vert.glsl b/source/blender/draw/engines/overlay/shaders/edit_gpencil_canvas_vert.glsl
new file mode 100644
index 00000000000..5aa7fe78e4e
--- /dev/null
+++ b/source/blender/draw/engines/overlay/shaders/edit_gpencil_canvas_vert.glsl
@@ -0,0 +1,35 @@
+
+uniform vec4 color;
+uniform vec3 xAxis;
+uniform vec3 yAxis;
+uniform vec3 origin;
+uniform int halfLineCount;
+
+flat out vec4 finalColor;
+flat out vec2 edgeStart;
+noperspective out vec2 edgePos;
+
+void main()
+{
+  GPU_INTEL_VERTEX_SHADER_WORKAROUND
+
+  vec2 pos;
+  pos.x = float(gl_VertexID % 2);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list