Gizmo: add optional background alpha for 2D button gizmo

This allows using the gizmo for a screen circle with a hollow
area in the center, useful for general dragging gizmos.
This commit is contained in:
Campbell Barton
2019-12-07 03:47:55 +11:00
parent 5e96b860a3
commit bd53c053f3

View File

@@ -71,29 +71,45 @@ typedef struct ButtonGizmo2D {
/* -------------------------------------------------------------------- */ /* -------------------------------------------------------------------- */
static void button2d_geom_draw_backdrop(const wmGizmo *gz, const float color[4], const bool select) static void button2d_geom_draw_backdrop(const wmGizmo *gz,
const float color[4],
const float fill_alpha,
const bool select)
{ {
GPU_line_width(gz->line_width); GPU_line_width(gz->line_width);
GPUVertFormat *format = immVertexFormat(); GPUVertFormat *format = immVertexFormat();
uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
immUniformColor4fv(color);
/* TODO, other draw styles */ /* TODO, other draw styles */
if (color[3] == 1.0 && select == false) { if (color[3] == 1.0 && fill_alpha == 1.0 && select == false) {
immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
immUniformColor4fv(color);
GPU_polygon_smooth(0); GPU_polygon_smooth(0);
imm_draw_circle_fill_2d(pos, 0, 0, 1.0f, CIRCLE_RESOLUTION); imm_draw_circle_fill_2d(pos, 0, 0, 1.0f, CIRCLE_RESOLUTION);
imm_draw_circle_wire_2d(pos, 0, 0, 1.0f, CIRCLE_RESOLUTION); imm_draw_circle_wire_2d(pos, 0, 0, 1.0f, CIRCLE_RESOLUTION);
GPU_polygon_smooth(1); GPU_polygon_smooth(1);
immUnbindProgram();
} }
else { else {
/* Draw fill. */
if ((fill_alpha != 0.0f) || (select == true)) {
float fill_color[4] = {UNPACK3(color), fill_alpha * color[3]};
immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
immUniformColor4fv(fill_color);
imm_draw_circle_fill_2d(pos, 0, 0, 1.0f, CIRCLE_RESOLUTION); imm_draw_circle_fill_2d(pos, 0, 0, 1.0f, CIRCLE_RESOLUTION);
immUnbindProgram();
} }
/* Draw outline. */
if ((fill_alpha != 1.0f) && (select == false)) {
immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
immUniformColor4fv(color);
GPU_line_width(gz->line_width);
imm_draw_circle_wire_2d(pos, 0, 0, 1.0f, CIRCLE_RESOLUTION);
immUnbindProgram(); immUnbindProgram();
}
}
UNUSED_VARS(select); UNUSED_VARS(select);
} }
@@ -167,14 +183,15 @@ static void button2d_draw_intern(const bContext *C,
if (select) { if (select) {
BLI_assert(is_3d); BLI_assert(is_3d);
button2d_geom_draw_backdrop(gz, color, select); button2d_geom_draw_backdrop(gz, color, 1.0, select);
} }
else { else {
GPU_blend(true); GPU_blend(true);
if (draw_options & ED_GIZMO_BUTTON_SHOW_BACKDROP) { if (draw_options & ED_GIZMO_BUTTON_SHOW_BACKDROP) {
button2d_geom_draw_backdrop(gz, color, select); const float fill_alpha = RNA_float_get(gz->ptr, "backdrop_fill_alpha");
button2d_geom_draw_backdrop(gz, color, fill_alpha, select);
} }
if (button->shape_batch[0] != NULL) { if (button->shape_batch[0] != NULL) {
@@ -336,6 +353,16 @@ static void GIZMO_GT_button_2d(wmGizmoType *gzt)
/* Currently only used for cursor display. */ /* Currently only used for cursor display. */
RNA_def_boolean(gzt->srna, "show_drag", true, "Show Drag", ""); RNA_def_boolean(gzt->srna, "show_drag", true, "Show Drag", "");
RNA_def_float(gzt->srna,
"backdrop_fill_alpha",
1.0f,
0.0f,
1.0,
"When below 1.0, draw the interior with a reduced alpha compared to the outline",
"",
0.0f,
1.0f);
} }
void ED_gizmotypes_button_2d(void) void ED_gizmotypes_button_2d(void)