[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