diff options
author | Hans Goudey <h.goudey@me.com> | 2022-09-02 23:43:53 +0300 |
---|---|---|
committer | Hans Goudey <h.goudey@me.com> | 2022-09-02 23:44:05 +0300 |
commit | b903b749442906a15cf5ea1ed9bacb2012ac0b5d (patch) | |
tree | 27aa973994f39678243c8264b2723fcceff6872c /source/blender | |
parent | 40d815dff6515834c1bce40c0a34cc80b39655d5 (diff) |
Cleanup: Deduplicate node link points evaluation functions
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/editors/space_node/drawnode.cc | 23 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_add.cc | 18 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_intern.hh | 8 | ||||
-rw-r--r-- | source/blender/editors/space_node/node_relationships.cc | 82 |
4 files changed, 54 insertions, 77 deletions
diff --git a/source/blender/editors/space_node/drawnode.cc b/source/blender/editors/space_node/drawnode.cc index cec33f4b3e2..a4db5edf0f6 100644 --- a/source/blender/editors/space_node/drawnode.cc +++ b/source/blender/editors/space_node/drawnode.cc @@ -1614,7 +1614,7 @@ static void calculate_inner_link_bezier_points(std::array<float2, 4> &points) } } -std::array<float2, 4> node_link_bezier_points(const bNodeLink &link) +static std::array<float2, 4> node_link_bezier_points(const bNodeLink &link) { std::array<float2, 4> points; points[0] = socket_link_connection_location(*link.fromsock, link); @@ -1634,29 +1634,26 @@ static bool node_link_draw_is_visible(const View2D &v2d, const std::array<float2 return true; } -bool node_link_bezier_points_evaluated(const bNodeLink &link, - float coord_array[][2], - const int resol) +void node_link_bezier_points_evaluated(const bNodeLink &link, + std::array<float2, NODE_LINK_RESOL + 1> &coords) { const std::array<float2, 4> points = node_link_bezier_points(link); - /* always do all three, to prevent data hanging around */ + /* The extra +1 in size is required by these functions and would be removed ideally. */ BKE_curve_forward_diff_bezier(points[0].x, points[1].x, points[2].x, points[3].x, - coord_array[0] + 0, - resol, - sizeof(float[2])); + &coords[0].x, + NODE_LINK_RESOL, + sizeof(float2)); BKE_curve_forward_diff_bezier(points[0].y, points[1].y, points[2].y, points[3].y, - coord_array[0] + 1, - resol, - sizeof(float[2])); - - return true; + &coords[0].y, + NODE_LINK_RESOL, + sizeof(float2)); } #define NODELINK_GROUP_SIZE 256 diff --git a/source/blender/editors/space_node/node_add.cc b/source/blender/editors/space_node/node_add.cc index 37db3296ec9..c5a9df54a82 100644 --- a/source/blender/editors/space_node/node_add.cc +++ b/source/blender/editors/space_node/node_add.cc @@ -106,18 +106,18 @@ static bool add_reroute_intersect_check(const bNodeLink &link, int tot, float2 &result) { - float coord_array[NODE_LINK_RESOL + 1][2]; - - if (node_link_bezier_points_evaluated(link, coord_array, NODE_LINK_RESOL)) { - for (int i = 0; i < tot - 1; i++) { - for (int b = 0; b < NODE_LINK_RESOL; b++) { - if (isect_seg_seg_v2_point( - mcoords[i], mcoords[i + 1], coord_array[b], coord_array[b + 1], result) > 0) { - return true; - } + std::array<float2, NODE_LINK_RESOL + 1> coords; + node_link_bezier_points_evaluated(link, coords); + + for (int i = 0; i < tot - 1; i++) { + for (int b = 0; b < NODE_LINK_RESOL; b++) { + if (isect_seg_seg_v2_point(mcoords[i], mcoords[i + 1], coords[b], coords[b + 1], result) > + 0) { + return true; } } } + return false; } diff --git a/source/blender/editors/space_node/node_intern.hh b/source/blender/editors/space_node/node_intern.hh index 5b376618912..d760a976862 100644 --- a/source/blender/editors/space_node/node_intern.hh +++ b/source/blender/editors/space_node/node_intern.hh @@ -229,11 +229,9 @@ void node_draw_link_bezier(const bContext &C, int th_col2, int th_col3, bool selected); -bool node_link_bezier_points_evaluated(const bNodeLink &link, float coord_array[][2], int resol); -/** - * Return quadratic beziers points for a given nodelink. - */ -std::array<float2, 4> node_link_bezier_points(const bNodeLink &link); + +void node_link_bezier_points_evaluated(const bNodeLink &link, + std::array<float2, NODE_LINK_RESOL + 1> &coords); void draw_nodespace_back_pix(const bContext &C, ARegion ®ion, diff --git a/source/blender/editors/space_node/node_relationships.cc b/source/blender/editors/space_node/node_relationships.cc index c1f18e16d70..0240aeaeb68 100644 --- a/source/blender/editors/space_node/node_relationships.cc +++ b/source/blender/editors/space_node/node_relationships.cc @@ -130,33 +130,16 @@ static void pick_input_link_by_link_intersect(const bContext &C, /* Distance to test overlapping of cursor on link. */ const float cursor_link_touch_distance = 12.5f * UI_DPI_FAC; - const int resolution = NODE_LINK_RESOL; - bNodeLink *link_to_pick = nullptr; clear_picking_highlight(&snode->edittree->links); LISTBASE_FOREACH (bNodeLink *, link, &snode->edittree->links) { if (link->tosock == socket) { /* Test if the cursor is near a link. */ - const std::array<float2, 4> points = node_link_bezier_points(*link); - - std::array<float2, NODE_LINK_RESOL + 1> data; - BKE_curve_forward_diff_bezier(points[0].x, - points[1].x, - points[2].x, - points[3].x, - &data[0].x, - resolution, - sizeof(float2)); - BKE_curve_forward_diff_bezier(points[0].y, - points[1].y, - points[2].y, - points[3].y, - &data[0].y, - resolution, - sizeof(float2)); - - for (const int i : IndexRange(data.size() - 1)) { - const float distance = dist_squared_to_line_segment_v2(cursor, data[i], data[i + 1]); + std::array<float2, NODE_LINK_RESOL + 1> coords; + node_link_bezier_points_evaluated(*link, coords); + + for (const int i : IndexRange(coords.size() - 1)) { + const float distance = dist_squared_to_line_segment_v2(cursor, coords[i], coords[i + 1]); if (distance < cursor_link_touch_distance) { link_to_pick = link; nldrag.last_picked_multi_input_socket_link = link_to_pick; @@ -1322,17 +1305,17 @@ void NODE_OT_link_make(wmOperatorType *ot) static bool node_links_intersect(bNodeLink &link, const float mcoords[][2], int tot) { - float coord_array[NODE_LINK_RESOL + 1][2]; + std::array<float2, NODE_LINK_RESOL + 1> coords; + node_link_bezier_points_evaluated(link, coords); - if (node_link_bezier_points_evaluated(link, coord_array, NODE_LINK_RESOL)) { - for (int i = 0; i < tot - 1; i++) { - for (int b = 0; b < NODE_LINK_RESOL; b++) { - if (isect_seg_seg_v2(mcoords[i], mcoords[i + 1], coord_array[b], coord_array[b + 1]) > 0) { - return true; - } + for (int i = 0; i < tot - 1; i++) { + for (int b = 0; b < NODE_LINK_RESOL; b++) { + if (isect_seg_seg_v2(mcoords[i], mcoords[i + 1], coords[b], coords[b + 1]) > 0) { + return true; } } } + return false; } @@ -1935,6 +1918,7 @@ static bool ed_node_link_conditions(ScrArea *area, void ED_node_link_intersect_test(ScrArea *area, int test) { + using namespace blender; using namespace blender::ed::space_node; bNode *select; @@ -1958,36 +1942,34 @@ void ED_node_link_intersect_test(ScrArea *area, int test) bNodeLink *selink = nullptr; float dist_best = FLT_MAX; LISTBASE_FOREACH (bNodeLink *, link, &snode->edittree->links) { - float coord_array[NODE_LINK_RESOL + 1][2]; if (node_link_is_hidden_or_dimmed(region->v2d, *link)) { continue; } - if (node_link_bezier_points_evaluated(*link, coord_array, NODE_LINK_RESOL)) { - float dist = FLT_MAX; + std::array<float2, NODE_LINK_RESOL + 1> coords; + node_link_bezier_points_evaluated(*link, coords); + float dist = FLT_MAX; - /* loop over link coords to find shortest dist to - * upper left node edge of a intersected line segment */ - for (int i = 0; i < NODE_LINK_RESOL; i++) { - /* Check if the node rectangle intersects the line from this point to next one. */ - if (BLI_rctf_isect_segment(&select->totr, coord_array[i], coord_array[i + 1])) { - /* store the shortest distance to the upper left edge - * of all intersections found so far */ - const float node_xy[] = {select->totr.xmin, select->totr.ymax}; + /* loop over link coords to find shortest dist to + * upper left node edge of a intersected line segment */ + for (int i = 0; i < NODE_LINK_RESOL; i++) { + /* Check if the node rectangle intersects the line from this point to next one. */ + if (BLI_rctf_isect_segment(&select->totr, coords[i], coords[i + 1])) { + /* store the shortest distance to the upper left edge + * of all intersections found so far */ + const float node_xy[] = {select->totr.xmin, select->totr.ymax}; - /* to be precise coord_array should be clipped by select->totr, - * but not done since there's no real noticeable difference */ - dist = min_ff( - dist_squared_to_line_segment_v2(node_xy, coord_array[i], coord_array[i + 1]), dist); - } + /* to be precise coords should be clipped by select->totr, + * but not done since there's no real noticeable difference */ + dist = min_ff(dist_squared_to_line_segment_v2(node_xy, coords[i], coords[i + 1]), dist); } + } - /* we want the link with the shortest distance to node center */ - if (dist < dist_best) { - dist_best = dist; - selink = link; - } + /* we want the link with the shortest distance to node center */ + if (dist < dist_best) { + dist_best = dist; + selink = link; } } |