[Bf-blender-cvs] [9375076] soc-2013-paint: Make selection of paint curve handles much easier.
Antony Riakiotakis
noreply at git.blender.org
Wed Jul 16 01:55:33 CEST 2014
Commit: 9375076161587c8e94a3a7a3c16740546ddc831d
Author: Antony Riakiotakis
Date: Wed Jul 16 02:55:23 2014 +0300
https://developer.blender.org/rB9375076161587c8e94a3a7a3c16740546ddc831d
Make selection of paint curve handles much easier.
===================================================================
M source/blender/editors/sculpt_paint/paint_curve.c
M source/blender/editors/sculpt_paint/paint_intern.h
===================================================================
diff --git a/source/blender/editors/sculpt_paint/paint_curve.c b/source/blender/editors/sculpt_paint/paint_curve.c
index 2b7dee1..37df94a 100644
--- a/source/blender/editors/sculpt_paint/paint_curve.c
+++ b/source/blender/editors/sculpt_paint/paint_curve.c
@@ -50,6 +50,7 @@
#include "paint_intern.h"
+#define PAINT_CURVE_SELECT_THRESHOLD 40.0f
int paint_curve_poll(bContext *C)
{
@@ -160,6 +161,51 @@ static void paintcurve_undo_begin(bContext *C, wmOperator *op, PaintCurve *pc)
ED_undo_paint_push_end(undo_stack_id);
}
+#define SEL_F1 (1 << 0)
+#define SEL_F2 (1 << 1)
+#define SEL_F3 (1 << 2)
+
+/* 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;
+}
/******************* Operators *********************************/
@@ -404,55 +450,31 @@ static bool paintcurve_point_select(bContext *C, wmOperator *op, const int loc[2
}
}
else {
-#define SEL_F1 (1 << 0)
-#define SEL_F2 (1 << 1)
-#define SEL_F3 (1 << 2)
- int selflag;
- bool selected = false;
+ PaintCurvePoint *pcp;
+ char selflag;
- for (i = 0; i < pc->tot_points; i++, pcp++) {
- /* shift means constrained editing so exclude center handles from collision detection */
- if (!handle) {
- if (len_manhattan_v2v2(loc_fl, pcp->bez.vec[1]) < PAINT_CURVE_SELECT_THRESHOLD) {
- if (extend)
- pcp->bez.f2 ^= SELECT;
- else
- pcp->bez.f2 = SELECT;
- pc->add_index = i + 1;
- selflag = SEL_F2;
- break;
- }
- }
+ pcp = paintcurve_point_get_closest(pc, loc_fl, handle, PAINT_CURVE_SELECT_THRESHOLD, &selflag);
- if (len_manhattan_v2v2(loc_fl, pcp->bez.vec[0]) < PAINT_CURVE_SELECT_THRESHOLD) {
- if (extend)
- pcp->bez.f1 ^= SELECT;
- else
- pcp->bez.f1 = SELECT;
- pc->add_index = i + 1;
- selflag = SEL_F1;
+ if (pcp) {
+ pc->add_index = (pcp - pc->points) + 1;
+
+ if (selflag == SEL_F2) {
+ pcp->bez.f2 |= SELECT;
+ }
+ else if (selflag == SEL_F1) {
+ pcp->bez.f1 |= SELECT;
if (handle)
pcp->bez.h1 = HD_ALIGN;
- break;
}
-
- if (len_manhattan_v2v2(loc_fl, pcp->bez.vec[2]) < PAINT_CURVE_SELECT_THRESHOLD) {
- if (extend)
- pcp->bez.f3 ^= SELECT;
- else
- pcp->bez.f3 = SELECT;
- pc->add_index = i + 1;
- selflag = SEL_F3;
+ else if (selflag == SEL_F3) {
+ pcp->bez.f3 |= SELECT;
if (handle)
pcp->bez.h2 = HD_ALIGN;
- break;
}
}
- selected = (i != pc->tot_points);
-
/* clear selection for unselected points if not extending and if a point has been selected */
- if (!extend && selected) {
+ if (!extend && pcp) {
for (i = 0; i < pc->tot_points; i++) {
if ((pc->points + i) == pcp) {
switch (selflag) {
@@ -476,11 +498,7 @@ static bool paintcurve_point_select(bContext *C, wmOperator *op, const int loc[2
}
}
-#undef SEL_F1
-#undef SEL_F2
-#undef SEL_F3
-
- if (!selected)
+ if (!pcp)
return false;
}
diff --git a/source/blender/editors/sculpt_paint/paint_intern.h b/source/blender/editors/sculpt_paint/paint_intern.h
index b4fda3d..6d7c024 100644
--- a/source/blender/editors/sculpt_paint/paint_intern.h
+++ b/source/blender/editors/sculpt_paint/paint_intern.h
@@ -294,7 +294,5 @@ void paint_delete_blur_kernel(BlurKernel *);
/* paint curve defines */
#define PAINT_CURVE_NUM_SEGMENTS 40
-#define PAINT_CURVE_SELECT_THRESHOLD 8.0f
-
#endif /* __PAINT_INTERN_H__ */
More information about the Bf-blender-cvs
mailing list