Nodes: Improve readability of selected node links
This commit improves the drawing of selected node links: - Highlight the entire link to make it easier to spot where the link is going/coming from. - Always draw selected links on top, so they are always clearly visible. - Don't fade selected node links when the sockets they are connected to are out out view. - Dragged node links still get a partial highlight when they are only attached to one socket. Differential Revision: https://developer.blender.org/D11930
This commit is contained in:
@@ -681,6 +681,7 @@ void nodeRemLink(struct bNodeTree *ntree, struct bNodeLink *link);
|
|||||||
void nodeRemSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
|
void nodeRemSocketLinks(struct bNodeTree *ntree, struct bNodeSocket *sock);
|
||||||
void nodeMuteLinkToggle(struct bNodeTree *ntree, struct bNodeLink *link);
|
void nodeMuteLinkToggle(struct bNodeTree *ntree, struct bNodeLink *link);
|
||||||
bool nodeLinkIsHidden(const struct bNodeLink *link);
|
bool nodeLinkIsHidden(const struct bNodeLink *link);
|
||||||
|
bool nodeLinkIsSelected(const struct bNodeLink *link);
|
||||||
void nodeInternalRelink(struct bNodeTree *ntree, struct bNode *node);
|
void nodeInternalRelink(struct bNodeTree *ntree, struct bNode *node);
|
||||||
|
|
||||||
void nodeToView(const struct bNode *node, float x, float y, float *rx, float *ry);
|
void nodeToView(const struct bNode *node, float x, float y, float *rx, float *ry);
|
||||||
|
|||||||
@@ -2438,6 +2438,11 @@ bool nodeLinkIsHidden(const bNodeLink *link)
|
|||||||
return nodeSocketIsHidden(link->fromsock) || nodeSocketIsHidden(link->tosock);
|
return nodeSocketIsHidden(link->fromsock) || nodeSocketIsHidden(link->tosock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool nodeLinkIsSelected(const bNodeLink *link)
|
||||||
|
{
|
||||||
|
return (link->fromnode->flag & NODE_SELECT) || (link->tonode->flag & NODE_SELECT);
|
||||||
|
}
|
||||||
|
|
||||||
/* Adjust the indices of links connected to the given multi input socket after deleting the link at
|
/* Adjust the indices of links connected to the given multi input socket after deleting the link at
|
||||||
* `deleted_index`. This function also works if the link has not yet been deleted. */
|
* `deleted_index`. This function also works if the link has not yet been deleted. */
|
||||||
static void adjust_multi_input_indices_after_removed_link(bNodeTree *ntree,
|
static void adjust_multi_input_indices_after_removed_link(bNodeTree *ntree,
|
||||||
|
|||||||
@@ -1967,9 +1967,10 @@ void node_draw_link_bezier(const bContext &C,
|
|||||||
const bNodeLink &link,
|
const bNodeLink &link,
|
||||||
const int th_col1,
|
const int th_col1,
|
||||||
const int th_col2,
|
const int th_col2,
|
||||||
const int th_col3)
|
const int th_col3,
|
||||||
|
const bool selected)
|
||||||
{
|
{
|
||||||
const float dim_factor = node_link_dim_factor(v2d, link);
|
const float dim_factor = selected ? 1.0f : node_link_dim_factor(v2d, link);
|
||||||
float thickness = 1.5f;
|
float thickness = 1.5f;
|
||||||
float dash_factor = 1.0f;
|
float dash_factor = 1.0f;
|
||||||
|
|
||||||
@@ -2025,19 +2026,17 @@ void node_draw_link_bezier(const bContext &C,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Highlight links connected to selected nodes. */
|
/* Highlight links connected to selected nodes. */
|
||||||
const bool is_fromnode_selected = link.fromnode && link.fromnode->flag & SELECT;
|
if (selected) {
|
||||||
const bool is_tonode_selected = link.tonode && link.tonode->flag & SELECT;
|
|
||||||
if (is_fromnode_selected || is_tonode_selected) {
|
|
||||||
float color_selected[4];
|
float color_selected[4];
|
||||||
UI_GetThemeColor4fv(TH_EDGE_SELECT, color_selected);
|
UI_GetThemeColor4fv(TH_EDGE_SELECT, color_selected);
|
||||||
const float alpha = color_selected[3];
|
const float alpha = color_selected[3];
|
||||||
|
|
||||||
/* Interpolate color if highlight color is not fully transparent. */
|
/* Interpolate color if highlight color is not fully transparent. */
|
||||||
if (alpha != 0.0) {
|
if (alpha != 0.0) {
|
||||||
if (is_fromnode_selected) {
|
if (link.fromsock) {
|
||||||
interp_v3_v3v3(colors[1], colors[1], color_selected, alpha);
|
interp_v3_v3v3(colors[1], colors[1], color_selected, alpha);
|
||||||
}
|
}
|
||||||
if (is_tonode_selected) {
|
if (link.tosock) {
|
||||||
interp_v3_v3v3(colors[2], colors[2], color_selected, alpha);
|
interp_v3_v3v3(colors[2], colors[2], color_selected, alpha);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2102,7 +2101,8 @@ void node_draw_link_bezier(const bContext &C,
|
|||||||
void node_draw_link(const bContext &C,
|
void node_draw_link(const bContext &C,
|
||||||
const View2D &v2d,
|
const View2D &v2d,
|
||||||
const SpaceNode &snode,
|
const SpaceNode &snode,
|
||||||
const bNodeLink &link)
|
const bNodeLink &link,
|
||||||
|
const bool selected)
|
||||||
{
|
{
|
||||||
int th_col1 = TH_WIRE_INNER, th_col2 = TH_WIRE_INNER, th_col3 = TH_WIRE;
|
int th_col1 = TH_WIRE_INNER, th_col2 = TH_WIRE_INNER, th_col3 = TH_WIRE;
|
||||||
|
|
||||||
@@ -2146,7 +2146,7 @@ void node_draw_link(const bContext &C,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
node_draw_link_bezier(C, v2d, snode, link, th_col1, th_col2, th_col3);
|
node_draw_link_bezier(C, v2d, snode, link, th_col1, th_col2, th_col3, selected);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace blender::ed::space_node
|
} // namespace blender::ed::space_node
|
||||||
|
|||||||
@@ -660,7 +660,7 @@ static void node_draw_mute_line(const bContext &C,
|
|||||||
GPU_blend(GPU_BLEND_ALPHA);
|
GPU_blend(GPU_BLEND_ALPHA);
|
||||||
|
|
||||||
LISTBASE_FOREACH (const bNodeLink *, link, &node.internal_links) {
|
LISTBASE_FOREACH (const bNodeLink *, link, &node.internal_links) {
|
||||||
node_draw_link_bezier(C, v2d, snode, *link, TH_WIRE_INNER, TH_WIRE_INNER, TH_WIRE);
|
node_draw_link_bezier(C, v2d, snode, *link, TH_WIRE_INNER, TH_WIRE_INNER, TH_WIRE, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
GPU_blend(GPU_BLEND_NONE);
|
GPU_blend(GPU_BLEND_NONE);
|
||||||
@@ -2650,10 +2650,18 @@ static void node_draw_nodetree(const bContext &C,
|
|||||||
nodelink_batch_start(snode);
|
nodelink_batch_start(snode);
|
||||||
|
|
||||||
LISTBASE_FOREACH (bNodeLink *, link, &ntree.links) {
|
LISTBASE_FOREACH (bNodeLink *, link, &ntree.links) {
|
||||||
if (!nodeLinkIsHidden(link)) {
|
if (!nodeLinkIsHidden(link) && !nodeLinkIsSelected(link)) {
|
||||||
node_draw_link(C, region.v2d, snode, *link);
|
node_draw_link(C, region.v2d, snode, *link, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Draw selected node links after the unselected ones, so they are shown on top. */
|
||||||
|
LISTBASE_FOREACH (bNodeLink *, link, &ntree.links) {
|
||||||
|
if (!nodeLinkIsHidden(link) && nodeLinkIsSelected(link)) {
|
||||||
|
node_draw_link(C, region.v2d, snode, *link, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
nodelink_batch_end(snode);
|
nodelink_batch_end(snode);
|
||||||
GPU_blend(GPU_BLEND_NONE);
|
GPU_blend(GPU_BLEND_NONE);
|
||||||
|
|
||||||
@@ -2838,7 +2846,7 @@ void node_draw_space(const bContext &C, ARegion ®ion)
|
|||||||
GPU_line_smooth(true);
|
GPU_line_smooth(true);
|
||||||
if (snode.runtime->linkdrag) {
|
if (snode.runtime->linkdrag) {
|
||||||
for (const bNodeLink *link : snode.runtime->linkdrag->links) {
|
for (const bNodeLink *link : snode.runtime->linkdrag->links) {
|
||||||
node_draw_link(C, v2d, snode, *link);
|
node_draw_link(C, v2d, snode, *link, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
GPU_line_smooth(false);
|
GPU_line_smooth(false);
|
||||||
|
|||||||
@@ -196,7 +196,8 @@ void nodelink_batch_end(SpaceNode &snode);
|
|||||||
void node_draw_link(const bContext &C,
|
void node_draw_link(const bContext &C,
|
||||||
const View2D &v2d,
|
const View2D &v2d,
|
||||||
const SpaceNode &snode,
|
const SpaceNode &snode,
|
||||||
const bNodeLink &link);
|
const bNodeLink &link,
|
||||||
|
bool selected);
|
||||||
/**
|
/**
|
||||||
* Don't do shadows if th_col3 is -1.
|
* Don't do shadows if th_col3 is -1.
|
||||||
*/
|
*/
|
||||||
@@ -206,7 +207,8 @@ void node_draw_link_bezier(const bContext &C,
|
|||||||
const bNodeLink &link,
|
const bNodeLink &link,
|
||||||
int th_col1,
|
int th_col1,
|
||||||
int th_col2,
|
int th_col2,
|
||||||
int th_col3);
|
int th_col3,
|
||||||
|
bool selected);
|
||||||
/** If v2d not nullptr, it clips and returns 0 if not visible. */
|
/** If v2d not nullptr, it clips and returns 0 if not visible. */
|
||||||
bool node_link_bezier_points(const View2D *v2d,
|
bool node_link_bezier_points(const View2D *v2d,
|
||||||
const SpaceNode *snode,
|
const SpaceNode *snode,
|
||||||
|
|||||||
Reference in New Issue
Block a user