[Bf-blender-cvs] [2ff1ba7] soc-2013-paint: Add curve point from previous active point, which is the last selected point on the curve.
Antony Riakiotakis
noreply at git.blender.org
Fri Apr 18 00:18:32 CEST 2014
Commit: 2ff1ba7661fef905e1328b17d9d3ade156c3f405
Author: Antony Riakiotakis
Date: Fri Apr 18 01:18:23 2014 +0300
https://developer.blender.org/rB2ff1ba7661fef905e1328b17d9d3ade156c3f405
Add curve point from previous active point, which is the last selected
point on the curve.
===================================================================
M source/blender/editors/sculpt_paint/paint_ops.c
===================================================================
diff --git a/source/blender/editors/sculpt_paint/paint_ops.c b/source/blender/editors/sculpt_paint/paint_ops.c
index 3593026..3e8c17a 100644
--- a/source/blender/editors/sculpt_paint/paint_ops.c
+++ b/source/blender/editors/sculpt_paint/paint_ops.c
@@ -226,7 +226,7 @@ static void paintcurve_point_add(bContext *C, const int loc[2])
wmWindow *window = CTX_wm_window(C);
ARegion *ar = CTX_wm_region(C);
float vec[3] = {loc[0], loc[1], 0.0};
- int lastindex;
+ int add_index;
int i;
pc = br->paint_curve;
@@ -235,27 +235,33 @@ static void paintcurve_point_add(bContext *C, const int loc[2])
}
pcp = MEM_mallocN((pc->tot_points + 1) * sizeof(PaintCurvePoint), "PaintCurvePoint");
- lastindex = pc->tot_points;
+ add_index = pc->active_point;
if (pc->points) {
- memcpy(pcp, pc->points, pc->tot_points * sizeof(PaintCurvePoint));
+ if (add_index > 0)
+ memcpy(pcp, pc->points, add_index * sizeof(PaintCurvePoint));
+ if (add_index < pc->tot_points)
+ memcpy(pcp + add_index + 1, pc->points + add_index, (pc->tot_points - add_index) * sizeof(PaintCurvePoint));
+
MEM_freeN(pc->points);
}
pc->points = pcp;
pc->tot_points++;
/* initialize new point */
- memset(&pcp[lastindex], 0, sizeof(PaintCurvePoint));
- copy_v3_v3(pcp[lastindex].bez.vec[0], vec);
- copy_v3_v3(pcp[lastindex].bez.vec[1], vec);
- copy_v3_v3(pcp[lastindex].bez.vec[2], vec);
+ memset(&pcp[add_index], 0, sizeof(PaintCurvePoint));
+ copy_v3_v3(pcp[add_index].bez.vec[0], vec);
+ copy_v3_v3(pcp[add_index].bez.vec[1], vec);
+ copy_v3_v3(pcp[add_index].bez.vec[2], vec);
/* last step, clear selection from all bezier handles expect the next */
for (i = 0; i < pc->tot_points; i++) {
pcp[i].bez.f1 = pcp[i].bez.f2 = pcp[i].bez.f3 = 0;
}
- pcp[lastindex].bez.f3 = SELECT;
- pcp[lastindex].bez.h2 = HD_ALIGN;
+ pcp[add_index].bez.f3 = SELECT;
+ pcp[add_index].bez.h2 = HD_ALIGN;
+
+ pc->active_point = add_index + 1;
WM_paint_cursor_tag_redraw(window, ar);
}
@@ -327,12 +333,21 @@ static int paintcurve_delete_point_exec(bContext *C, wmOperator *UNUSED(op))
}
if (tot_del > 0) {
+ int j = 0;
int new_tot = pc->tot_points - tot_del;
PaintCurvePoint *points_new = MEM_mallocN(new_tot * sizeof(PaintCurvePoint), "PaintCurvePoint");
- PaintCurvePoint *pcp_new = points_new;
for (i = 0, pcp = pc->points; i < pc->tot_points; i++, pcp++) {
if (!(pcp->bez.f2 & DELETE_TAG)) {
- *pcp_new++ = pc->points[i];
+ points_new[j] = pc->points[i];
+
+ if (i == pc->active_point) {
+ pc->active_point = j;
+ }
+ j++;
+ }
+ else if (i == pc->active_point) {
+ /* prefer previous point */
+ pc->active_point = j;
}
}
MEM_freeN(pc->points);
@@ -411,6 +426,7 @@ static void paintcurve_point_select(bContext *C, const int loc[2], bool handle,
(fabs(loc[1] - pcp->bez.vec[1][1]) < PAINT_CURVE_SELECT_THRESHOLD))
{
pcp->bez.f2 ^= SELECT;
+ pc->active_point = i;
break;
}
}
@@ -419,6 +435,7 @@ static void paintcurve_point_select(bContext *C, const int loc[2], bool handle,
(fabs(loc[1] - pcp->bez.vec[0][1]) < PAINT_CURVE_SELECT_THRESHOLD))
{
pcp->bez.f1 ^= SELECT;
+ pc->active_point = i;
if (handle)
pcp->bez.h1 = HD_ALIGN;
break;
@@ -428,6 +445,7 @@ static void paintcurve_point_select(bContext *C, const int loc[2], bool handle,
(fabs(loc[1] - pcp->bez.vec[2][1]) < PAINT_CURVE_SELECT_THRESHOLD))
{
pcp->bez.f3 ^= SELECT;
+ pc->active_point = i;
if (handle)
pcp->bez.h2 = HD_ALIGN;
break;
More information about the Bf-blender-cvs
mailing list