From ddba5e0be37a7b13de309e543fcb3658edb2d60d Mon Sep 17 00:00:00 2001 From: Nathan Craddock Date: Mon, 28 Sep 2020 07:54:32 -0600 Subject: Outliner: Draw hierarchy lines dashed for object children Draw dashed lines for object child hierarchies in the outliner. This makes the difference between collection and object hierarchies more clear. Dashes are also consistent with viewport relationship lines. Differential Revision: https://developer.blender.org/D8997 --- .../blender/editors/space_outliner/outliner_draw.c | 35 ++++++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) (limited to 'source/blender/editors/space_outliner/outliner_draw.c') diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c index 1160a5b926c..eb6b5c7d295 100644 --- a/source/blender/editors/space_outliner/outliner_draw.c +++ b/source/blender/editors/space_outliner/outliner_draw.c @@ -3194,6 +3194,23 @@ static bool subtree_contains_object(ListBase *lb) return false; } +static void outliner_draw_hierarchy_line( + const uint pos, const int x, const int y1, const int y2, const bool draw_dashed) +{ + /* Small vertical padding. */ + const short line_padding = UI_UNIT_Y / 4.0f; + + /* >= is 1.0 for undashed lines. */ + immUniform1f("dash_factor", draw_dashed ? 0.5f : 1.0f); + + immBegin(GPU_PRIM_LINES, 2); + /* Intentionally draw from top to bottom, so collapsing a child item doesn't make the dashes + * appear to move. */ + immVertex2f(pos, x, y2 + line_padding); + immVertex2f(pos, x, y1 - line_padding); + immEnd(); +} + static void outliner_draw_hierarchy_lines_recursive(uint pos, SpaceOutliner *space_outliner, ListBase *lb, @@ -3205,14 +3222,13 @@ static void outliner_draw_hierarchy_lines_recursive(uint pos, bTheme *btheme = UI_GetTheme(); int y = *starty; - /* Small vertical padding */ - const short line_padding = UI_UNIT_Y / 4.0f; - /* Draw vertical lines between collections */ bool draw_hierarchy_line; + bool is_object_line; LISTBASE_FOREACH (TreeElement *, te, lb) { TreeStoreElem *tselem = TREESTORE(te); draw_hierarchy_line = false; + is_object_line = false; *starty -= UI_UNIT_Y; short color_tag = COLLECTION_COLOR_NONE; @@ -3229,6 +3245,7 @@ static void outliner_draw_hierarchy_lines_recursive(uint pos, else if (tselem->type == 0 && te->idcode == ID_OB) { if (subtree_contains_object(&te->subtree)) { draw_hierarchy_line = true; + is_object_line = true; y = *starty; } } @@ -3245,7 +3262,7 @@ static void outliner_draw_hierarchy_lines_recursive(uint pos, immUniformColor4ubv(col); } - immRecti(pos, startx, y - line_padding, startx + (U.pixelsize * 1), *starty + line_padding); + outliner_draw_hierarchy_line(pos, startx, y, *starty, is_object_line); } } } @@ -3256,10 +3273,16 @@ static void outliner_draw_hierarchy_lines(SpaceOutliner *space_outliner, int *starty) { GPUVertFormat *format = immVertexFormat(); - uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_I32, 2, GPU_FETCH_INT_TO_FLOAT); + uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); uchar col[4]; - immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); + immBindBuiltinProgram(GPU_SHADER_2D_LINE_DASHED_UNIFORM_COLOR); + + float viewport_size[4]; + GPU_viewport_size_get_f(viewport_size); + immUniform2f("viewport_size", viewport_size[2] / UI_DPI_FAC, viewport_size[3] / UI_DPI_FAC); + immUniform1i("colors_len", 0); /* "simple" mode */ + immUniform1f("dash_width", 8.0f); UI_GetThemeColorBlend3ubv(TH_BACK, TH_TEXT, 0.4f, col); col[3] = 255; -- cgit v1.2.3