[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