Ejemplo n.º 1
0
/* 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;
}
Ejemplo n.º 2
0
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;
	}
}