diff options
Diffstat (limited to 'source/blender/draw/modes')
3 files changed, 106 insertions, 7 deletions
diff --git a/source/blender/draw/modes/edit_curve_mode.c b/source/blender/draw/modes/edit_curve_mode.c index 3f2c75407b7..d1c40fe9b03 100644 --- a/source/blender/draw/modes/edit_curve_mode.c +++ b/source/blender/draw/modes/edit_curve_mode.c @@ -45,10 +45,12 @@ extern struct GlobalsUboStorage ts; /* draw_common.c */ extern char datatoc_common_globals_lib_glsl[]; extern char datatoc_edit_curve_overlay_loosevert_vert_glsl[]; extern char datatoc_edit_curve_overlay_frag_glsl[]; +extern char datatoc_edit_curve_overlay_handle_geom_glsl[]; extern char datatoc_gpu_shader_3D_vert_glsl[]; extern char datatoc_gpu_shader_uniform_color_frag_glsl[]; extern char datatoc_gpu_shader_point_uniform_color_frag_glsl[]; +extern char datatoc_gpu_shader_flat_color_frag_glsl[]; /* *********** LISTS *********** */ /* All lists are per viewport specific datas. @@ -158,7 +160,11 @@ static void EDIT_CURVE_engine_init(void *vedata) } if (!e_data.overlay_edge_sh) { - e_data.overlay_edge_sh = GPU_shader_get_builtin_shader(GPU_SHADER_3D_UNIFORM_COLOR); + e_data.overlay_edge_sh = DRW_shader_create_with_lib( + datatoc_edit_curve_overlay_loosevert_vert_glsl, + datatoc_edit_curve_overlay_handle_geom_glsl, + datatoc_gpu_shader_flat_color_frag_glsl, + datatoc_common_globals_lib_glsl, NULL); } if (!e_data.overlay_vert_sh) { @@ -189,15 +195,14 @@ static void EDIT_CURVE_cache_init(void *vedata) stl->g_data->wire_shgrp = DRW_shgroup_create(e_data.wire_sh, psl->wire_pass); - /* TODO: following handle theme colors, - * For now use overlay vert shader for handles (we want them colored): - * TH_NURB_ULINE, TH_NURB_SEL_ULINE, TH_HANDLE_* */ psl->overlay_edge_pass = DRW_pass_create( "Curve Handle Overlay", DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_WIRE); - /* TODO: following handle theme colors, - * For now use overlay vert shader for handles (we want them colored) */ - stl->g_data->overlay_edge_shgrp = DRW_shgroup_create(e_data.overlay_vert_sh, psl->overlay_edge_pass); + + DRWShadingGroup *overlay_edge_shgrp = DRW_shgroup_create(e_data.overlay_edge_sh, psl->overlay_edge_pass); + DRW_shgroup_uniform_vec2(overlay_edge_shgrp, "viewportSize", DRW_viewport_size_get(), 1); + stl->g_data->overlay_edge_shgrp = overlay_edge_shgrp; + psl->overlay_vert_pass = DRW_pass_create( "Curve Vert Overlay", @@ -293,6 +298,7 @@ static void EDIT_CURVE_draw_scene(void *vedata) * Mostly used for freeing shaders */ static void EDIT_CURVE_engine_free(void) { + DRW_SHADER_FREE_SAFE(e_data.overlay_edge_sh); DRW_SHADER_FREE_SAFE(e_data.overlay_vert_sh); } diff --git a/source/blender/draw/modes/shaders/common_globals_lib.glsl b/source/blender/draw/modes/shaders/common_globals_lib.glsl index dc36d252926..0c14c1e7db0 100644 --- a/source/blender/draw/modes/shaders/common_globals_lib.glsl +++ b/source/blender/draw/modes/shaders/common_globals_lib.glsl @@ -37,6 +37,20 @@ layout(std140) uniform globalsBlock { vec4 colorBackground; + vec4 colorHandleFree; + vec4 colorHandleAuto; + vec4 colorHandleVect; + vec4 colorHandleAlign; + vec4 colorHandleAutoclamp; + vec4 colorHandleSelFree; + vec4 colorHandleSelAuto; + vec4 colorHandleSelVect; + vec4 colorHandleSelAlign; + vec4 colorHandleSelAutoclamp; + vec4 colorNurbUline; + vec4 colorNurbSelUline; + vec4 colorActiveSpline; + vec4 colorGrid; vec4 colorGridEmphasise; vec4 colorGridAxisX; diff --git a/source/blender/draw/modes/shaders/edit_curve_overlay_handle_geom.glsl b/source/blender/draw/modes/shaders/edit_curve_overlay_handle_geom.glsl new file mode 100644 index 00000000000..419a25f91b4 --- /dev/null +++ b/source/blender/draw/modes/shaders/edit_curve_overlay_handle_geom.glsl @@ -0,0 +1,79 @@ + +#define ACTIVE_NURB 1 << 7 /* Keep the same value of `ACTIVE_NURB` in `draw_cache_imp_curve.c` */ + +layout(lines) in; +layout(line_strip, max_vertices = 6) out; + +uniform vec2 viewportSize; + +flat in int vertFlag[]; + +flat out vec4 finalColor; + +void main() +{ + /* TODO: vertex size */ + + vec4 v1 = gl_in[0].gl_Position; + vec4 v2 = gl_in[1].gl_Position; + + int is_active_nurb = vertFlag[1] & ACTIVE_NURB; + int color_id = vertFlag[1] ^ is_active_nurb; + + if (is_active_nurb != 0) { + /* draw the outline. */ + vec2 v1_2 = v2.xy - v1.xy; + vec2 offset; + + if (abs(v1_2.x * viewportSize.x) < abs(v1_2.y * viewportSize.y)) { + offset = vec2(2.0 / viewportSize.x, 0.0); + } + else { + offset = vec2(0.0, 2.0 / viewportSize.y); + } + + finalColor = colorActiveSpline; + + gl_Position = v1; + gl_Position.xy += offset * v1.w; + EmitVertex(); + + gl_Position = v2; + gl_Position.xy += offset * v2.w; + EmitVertex(); + + EndPrimitive(); + + gl_Position = v1; + gl_Position.xy -= offset * v1.w; + EmitVertex(); + + gl_Position = v2; + gl_Position.xy -= offset * v2.w; + EmitVertex(); + + EndPrimitive(); + } + + if (color_id == 0) finalColor = colorHandleFree; + else if (color_id == 1) finalColor = colorHandleAuto; + else if (color_id == 2) finalColor = colorHandleVect; + else if (color_id == 3) finalColor = colorHandleAlign; + else if (color_id == 4) finalColor = colorHandleAutoclamp; + else if (color_id == 5) finalColor = colorHandleSelFree; + else if (color_id == 6) finalColor = colorHandleSelAuto; + else if (color_id == 7) finalColor = colorHandleSelVect; + else if (color_id == 8) finalColor = colorHandleSelAlign; + else if (color_id == 9) finalColor = colorHandleSelAutoclamp; + else if (color_id == 10) finalColor = colorNurbUline; + else if (color_id == 11) finalColor = colorNurbSelUline; + else finalColor = colorVertexSelect; + + gl_Position = v1; + EmitVertex(); + + gl_Position = v2; + EmitVertex(); + + EndPrimitive(); +} |