[Bf-blender-cvs] [66297cc26b5] master: Gizmo: support drawing contrasting shapes a generic backdrop

Campbell Barton noreply at git.blender.org
Fri Nov 22 07:25:51 CET 2019


Commit: 66297cc26b5982492900064cbd48335e49a2a6db
Author: Campbell Barton
Date:   Fri Nov 22 17:18:52 2019 +1100
Branches: master
https://developer.blender.org/rB66297cc26b5982492900064cbd48335e49a2a6db

Gizmo: support drawing contrasting shapes a generic backdrop

Previously the only way to draw polygon shapes from buttons
was to use a polygon that included the circular outline
with negative space for the un-filled areas.

This didn't always have visibility, especially when the gizmo was
overlaying colors that didn't contrast much.

Support drawing a generic backdrop with a polygon shape over it.

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

M	source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c

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

diff --git a/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c b/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c
index ecbc503e084..125adfb1ffb 100644
--- a/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c
+++ b/source/blender/editors/gizmo_library/gizmo_types/button2d_gizmo.c
@@ -83,7 +83,15 @@ static void button2d_geom_draw_backdrop(const wmGizmo *gz, const float color[4],
   immUniformColor4fv(color);
 
   /* TODO, other draw styles */
-  imm_draw_circle_fill_2d(pos, 0, 0, 1.0f, CIRCLE_RESOLUTION);
+  if (color[3] == 1.0 && select == false) {
+    GPU_polygon_smooth(0);
+    imm_draw_circle_fill_2d(pos, 0, 0, 1.0f, CIRCLE_RESOLUTION);
+    imm_draw_circle_wire_2d(pos, 0, 0, 1.0f, CIRCLE_RESOLUTION);
+    GPU_polygon_smooth(1);
+  }
+  else {
+    imm_draw_circle_fill_2d(pos, 0, 0, 1.0f, CIRCLE_RESOLUTION);
+  }
 
   immUnbindProgram();
 
@@ -101,6 +109,7 @@ static void button2d_draw_intern(const bContext *C,
   if (button->is_init == false) {
     button->is_init = true;
     PropertyRNA *prop = RNA_struct_find_property(gz->ptr, "icon");
+    button->icon = -1;
     if (RNA_property_is_set(gz->ptr, prop)) {
       button->icon = RNA_property_enum_get(gz->ptr, prop);
     }
@@ -163,6 +172,11 @@ static void button2d_draw_intern(const bContext *C,
   else {
 
     GPU_blend(true);
+
+    if (draw_options & ED_GIZMO_BUTTON_SHOW_BACKDROP) {
+      button2d_geom_draw_backdrop(gz, color, select);
+    }
+
     if (button->shape_batch[0] != NULL) {
       GPU_line_smooth(true);
       GPU_polygon_smooth(false);
@@ -170,7 +184,21 @@ static void button2d_draw_intern(const bContext *C,
       for (uint i = 0; i < ARRAY_SIZE(button->shape_batch) && button->shape_batch[i]; i++) {
         /* Invert line color for wire. */
         GPU_batch_program_set_builtin(button->shape_batch[i], GPU_SHADER_2D_UNIFORM_COLOR);
-        GPU_batch_uniform_4f(button->shape_batch[i], "color", UNPACK4(color));
+
+        if (draw_options & ED_GIZMO_BUTTON_SHOW_BACKDROP) {
+          /* If we have a backdrop already,
+           * draw a contrasting shape over it instead of drawing it the same color.
+           * Use a low value instead of 50% so some darker primary colors
+           * aren't considered being close to black. */
+          float color_contrast[4];
+          copy_v3_fl(color_contrast, rgb_to_grayscale(color) < 0.2f ? 1 : 0);
+          color_contrast[3] = color[3];
+          GPU_batch_uniform_4f(button->shape_batch[i], "color", UNPACK4(color_contrast));
+        }
+        else {
+          GPU_batch_uniform_4f(button->shape_batch[i], "color", UNPACK4(color));
+        }
+
         GPU_batch_draw(button->shape_batch[i]);
 
         if (draw_options & ED_GIZMO_BUTTON_SHOW_OUTLINE) {
@@ -182,11 +210,7 @@ static void button2d_draw_intern(const bContext *C,
       GPU_line_smooth(false);
       GPU_polygon_smooth(true);
     }
-    else if (button->icon != ICON_NONE) {
-      if (draw_options & ED_GIZMO_BUTTON_SHOW_BACKDROP) {
-        button2d_geom_draw_backdrop(gz, color, select);
-      }
-
+    else if (button->icon != -1) {
       float pos[2];
       if (is_3d) {
         const float fac = 2.0f;



More information about the Bf-blender-cvs mailing list