Manipulator: outline & helpline options for button
authorCampbell Barton <ideasman42@gmail.com>
Mon, 14 May 2018 21:18:36 +0000 (23:18 +0200)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 14 May 2018 21:18:36 +0000 (23:18 +0200)
source/blender/editors/include/ED_manipulator_library.h
source/blender/editors/manipulator_library/manipulator_types/button2d_manipulator.c
source/blender/editors/space_view3d/view3d_manipulator_navigate.c

index 7166292147ed1c072022c7765f5c33596e56aa57..b67af4274a6b66df9388ad6ba41c95176a6113ee 100644 (file)
@@ -192,6 +192,18 @@ enum {
        ED_MANIPULATOR_GRAB_STYLE_CROSS_2D = 1,
 };
 
+/* -------------------------------------------------------------------- */
+/* Button Manipulator */
+
+enum {
+       ED_MANIPULATOR_BUTTON_SHOW_OUTLINE = (1 << 0),
+       /**
+        * Draw a line from the origin to the offset (similar to an arrow)
+        * sometimes needed to show what the button edits.
+        */
+       ED_MANIPULATOR_BUTTON_SHOW_HELPLINE = (1 << 1),
+};
+
 
 /* -------------------------------------------------------------------- */
 /* Primitive Manipulator */
index fbf783c31f7121434976ff52d24ee90fcbaded01..770e7716dd27ca5788b4e857360337ce75fe0c14 100644 (file)
@@ -103,6 +103,7 @@ static void button2d_draw_intern(
 {
        ButtonManipulator2D *button = (ButtonManipulator2D *)mpr;
 
+       const int draw_options = RNA_enum_get(mpr->ptr, "draw_options");
        if (button->is_init == false) {
                button->is_init = true;
                PropertyRNA *prop = RNA_struct_find_property(mpr->ptr, "icon");
@@ -115,8 +116,8 @@ static void button2d_draw_intern(
                        /* We shouldn't need the +1, but a NULL char is set. */
                        char *polys = MEM_mallocN(polys_len + 1, __func__);
                        RNA_property_string_get(mpr->ptr, prop, polys);
-                       button->shape_batch[0] = GPU_batch_wire_from_poly_2d_encoded((uchar *)polys, polys_len, NULL);
-                       button->shape_batch[1] = GPU_batch_tris_from_poly_2d_encoded((uchar *)polys, polys_len, NULL);
+                       button->shape_batch[0] = GPU_batch_tris_from_poly_2d_encoded((uchar *)polys, polys_len, NULL);
+                       button->shape_batch[1] = GPU_batch_wire_from_poly_2d_encoded((uchar *)polys, polys_len, NULL);
                        MEM_freeN(polys);
                }
        }
@@ -127,11 +128,29 @@ static void button2d_draw_intern(
        manipulator_color_get(mpr, highlight, color);
        WM_manipulator_calc_matrix_final(mpr, matrix_final);
 
+
+       bool is_3d = (mpr->parent_mgroup->type->flag & WM_MANIPULATORGROUPTYPE_3D) != 0;
+
+
+       if (draw_options & ED_MANIPULATOR_BUTTON_SHOW_HELPLINE) {
+               float matrix_final_no_offset[4][4];
+               WM_manipulator_calc_matrix_final_no_offset(mpr, matrix_final_no_offset);
+               uint pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_F32, 3, GWN_FETCH_FLOAT);
+               immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
+               immUniformColor4fv(color);
+               glLineWidth(mpr->line_width);
+               immUniformColor4fv(color);
+               immBegin(GWN_PRIM_LINE_STRIP, 2);
+               immVertex3fv(pos, matrix_final[3]);
+               immVertex3fv(pos, matrix_final_no_offset[3]);
+               immEnd();
+               immUnbindProgram();
+       }
+
        bool need_to_pop = true;
        gpuPushMatrix();
        gpuMultMatrix(matrix_final);
 
-       bool is_3d = (mpr->parent_mgroup->type->flag & WM_MANIPULATORGROUPTYPE_3D) != 0;
        if (is_3d) {
                RegionView3D *rv3d = CTX_wm_region_view3d(C);
                float matrix_align[4][4];
@@ -148,21 +167,26 @@ static void button2d_draw_intern(
                button2d_geom_draw_backdrop(mpr, color, select);
        }
        else {
+
                glEnable(GL_BLEND);
                if (button->shape_batch[0] != NULL) {
                        glEnable(GL_LINE_SMOOTH);
+                       glDisable(GL_POLYGON_SMOOTH);
                        glLineWidth(1.0f);
                        for (uint i = 0; i < ARRAY_SIZE(button->shape_batch) && button->shape_batch[i]; i++) {
                                /* Invert line color for wire. */
-                               color[0] = 1.0f - color[0];
-                               color[1] = 1.0f - color[1];
-                               color[2] = 1.0f - color[2];
-
                                GWN_batch_program_set_builtin(button->shape_batch[i], GPU_SHADER_2D_UNIFORM_COLOR);
                                GWN_batch_uniform_4f(button->shape_batch[i], "color", UNPACK4(color));
                                GWN_batch_draw(button->shape_batch[i]);
+
+                               if (draw_options & ED_MANIPULATOR_BUTTON_SHOW_OUTLINE) {
+                                       color[0] = 1.0f - color[0];
+                                       color[1] = 1.0f - color[1];
+                                       color[2] = 1.0f - color[2];
+                               }
                        }
                        glDisable(GL_LINE_SMOOTH);
+                       glEnable(GL_POLYGON_SMOOTH);
                }
                else if (button->icon != ICON_NONE) {
                        button2d_geom_draw_backdrop(mpr, color, select);
@@ -270,7 +294,15 @@ static void MANIPULATOR_WT_button_2d(wmManipulatorType *wt)
        wt->struct_size = sizeof(ButtonManipulator2D);
 
        /* rna */
+       static EnumPropertyItem rna_enum_draw_options[] = {
+               {ED_MANIPULATOR_BUTTON_SHOW_OUTLINE, "OUTLINE", 0, "Outline", ""},
+               {ED_MANIPULATOR_BUTTON_SHOW_HELPLINE, "HELPLINE", 0, "Help Line", ""},
+               {0, NULL, 0, NULL, NULL}
+       };
        PropertyRNA *prop;
+
+       RNA_def_enum_flag(wt->srna, "draw_options", rna_enum_draw_options, 0, "Draw Options", "");
+
        prop = RNA_def_property(wt->srna, "icon", PROP_ENUM, PROP_NONE);
        RNA_def_property_enum_items(prop, rna_enum_icon_items);
 
index 2d3f42f9c6108e395e38e02ccfc173e1daee8737..0a2097670032acce7093b416c8caba99bc2e7888 100644 (file)
@@ -211,6 +211,7 @@ static void WIDGETGROUP_navigate_setup(const bContext *UNUSED(C), wmManipulatorG
                        RNA_property_string_set_bytes(
                                mpr->ptr, prop,
                                (const char *)info->shape, info->shape_size);
+                       RNA_enum_set(mpr->ptr, "draw_options", ED_MANIPULATOR_BUTTON_SHOW_OUTLINE);
                }
 
                wmOperatorType *ot = WM_operatortype_find(info->opname, true);