/* returns 0, 1, or 2 in point according to handle 1, pivot or handle 2 */ static PaintCurvePoint *paintcurve_point_get_closest( PaintCurve *pc, const float pos[2], bool ignore_pivot, const float threshold, char *point) { PaintCurvePoint *pcp, *closest = NULL; int i; float dist, closest_dist = FLT_MAX; for (i = 0, pcp = pc->points; i < pc->tot_points; i++, pcp++) { dist = len_manhattan_v2v2(pos, pcp->bez.vec[0]); if (dist < threshold) { if (dist < closest_dist) { closest = pcp; closest_dist = dist; if (point) { *point = SEL_F1; } } } if (!ignore_pivot) { dist = len_manhattan_v2v2(pos, pcp->bez.vec[1]); if (dist < threshold) { if (dist < closest_dist) { closest = pcp; closest_dist = dist; if (point) { *point = SEL_F2; } } } } dist = len_manhattan_v2v2(pos, pcp->bez.vec[2]); if (dist < threshold) { if (dist < closest_dist) { closest = pcp; closest_dist = dist; if (point) { *point = SEL_F3; } } } } return closest; }
static void findnearestLattvert__doClosest(void *userData, BPoint *bp, const float screen_co[2]) { struct { BPoint *bp; float dist; int select; float mval_fl[2]; } *data = userData; float dist_test = len_manhattan_v2v2(data->mval_fl, screen_co); if ((bp->f1 & SELECT) && data->select) dist_test += 5.0f; if (dist_test < data->dist) { data->dist = dist_test; data->bp = bp; } }