diff options
Diffstat (limited to 'source/blender/editors/space_outliner/outliner_draw.c')
-rw-r--r-- | source/blender/editors/space_outliner/outliner_draw.c | 35 |
1 files changed, 29 insertions, 6 deletions
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; |