char snapNodeBorder;
ListBase points;
TransSnapPoint *selectedPoint;
- float dist; // Distance from snapPoint to snapTarget
double last;
void (*applySnap)(struct TransInfo *, float *);
void (*calcSnap)(struct TransInfo *, float *);
void (*targetSnap)(struct TransInfo *);
- /* Get the transform distance between two points (used by Closest snap) */
+ /**
+ * Get the transform distance between two points (used by Closest snap)
+ *
+ * \note Return value can be anything,
+ * where the smallest absolute value defines whats closest.
+ */
float (*distance)(struct TransInfo *, const float p1[3], const float p2[3]);
} TransSnap;
static float TranslationBetween(TransInfo *UNUSED(t), const float p1[3], const float p2[3])
{
- return len_v3v3(p1, p2);
+ return len_squared_v3v3(p1, p2);
}
static float RotationBetween(TransInfo *t, const float p1[3], const float p2[3])
{
// Only valid if a snap point has been selected
if (t->tsnap.status & POINT_INIT) {
+ float dist_closest = 0.0f;
TransData *closest = NULL, *td = NULL;
/* Object mode */
dist = t->tsnap.distance(t, loc, t->tsnap.snapPoint);
if ((dist != TRANSFORM_DIST_INVALID) &&
- (closest == NULL || fabsf(dist) < fabsf(t->tsnap.dist)))
+ (closest == NULL || fabsf(dist) < fabsf(dist_closest)))
{
copy_v3_v3(t->tsnap.snapTarget, loc);
closest = td;
- t->tsnap.dist = dist;
+ dist_closest = dist;
}
}
}
dist = t->tsnap.distance(t, loc, t->tsnap.snapPoint);
if ((dist != TRANSFORM_DIST_INVALID) &&
- (closest == NULL || fabsf(dist) < fabsf(t->tsnap.dist)))
+ (closest == NULL || fabsf(dist) < fabsf(dist_closest)))
{
copy_v3_v3(t->tsnap.snapTarget, loc);
closest = td;
- t->tsnap.dist = dist;
}
}
}
dist = t->tsnap.distance(t, loc, t->tsnap.snapPoint);
if ((dist != TRANSFORM_DIST_INVALID) &&
- (closest == NULL || fabsf(dist) < fabsf(t->tsnap.dist)))
+ (closest == NULL || fabsf(dist) < fabsf(dist_closest)))
{
copy_v3_v3(t->tsnap.snapTarget, loc);
closest = td;
- t->tsnap.dist = dist;
+ dist_closest = dist;
}
}
}