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
This commit is contained in:
Nathan Craddock 2020-09-28 07:54:32 -06:00
parent c6b904e972
commit ddba5e0be3
1 changed files with 29 additions and 6 deletions

View File

@ -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;