Commit: aaa0383ef3b509d09df8aa5f5f6843fbf0f0aa93 Author: Antony Riakiotakis Date: Mon Jul 14 15:00:34 2014 +0300 https://developer.blender.org/rBaaa0383ef3b509d09df8aa5f5f6843fbf0f0aa93
Paint Curves: * Change behaviour of selection - selecting in empty space now will not clear selection. This leads to: * Improved behaviour of right click translate. Now even dragging in empty space will drag correctly. =================================================================== M source/blender/editors/sculpt_paint/paint_curve.c M source/blender/editors/sculpt_paint/paint_image_2d.c M source/blender/editors/sculpt_paint/paint_intern.h M source/blender/editors/sculpt_paint/paint_ops.c =================================================================== diff --git a/source/blender/editors/sculpt_paint/paint_curve.c b/source/blender/editors/sculpt_paint/paint_curve.c index 99d7463..2b7dee1 100644 --- a/source/blender/editors/sculpt_paint/paint_curve.c +++ b/source/blender/editors/sculpt_paint/paint_curve.c @@ -363,7 +363,7 @@ void PAINTCURVE_OT_delete_point(wmOperatorType *ot) } -static void paintcurve_point_select(bContext *C, wmOperator *op, const int loc[2], +static bool paintcurve_point_select(bContext *C, wmOperator *op, const int loc[2], bool handle, bool toggle, bool extend) { wmWindow *window = CTX_wm_window(C); @@ -373,20 +373,21 @@ static void paintcurve_point_select(bContext *C, wmOperator *op, const int loc[2 PaintCurve *pc; PaintCurvePoint *pcp; int i; - char select = 0; const float loc_fl[2] = {UNPACK2(loc)}; pc = br->paint_curve; if (!pc) - return; + return false; paintcurve_undo_begin(C, op, pc); pcp = pc->points; if (toggle) { + char select = 0; bool selected = false; + for (i = 0; i < pc->tot_points; i++) { if (pcp[i].bez.f1 || pcp[i].bez.f2 || pcp[i].bez.f3) { selected = true; @@ -397,45 +398,95 @@ static void paintcurve_point_select(bContext *C, wmOperator *op, const int loc[2 if (!selected) { select = SELECT; } - } - if (!extend) { - /* first clear selection from all bezier handles */ for (i = 0; i < pc->tot_points; i++) { - pcp[i].bez.f1 = pcp[i].bez.f2 = pcp[i].bez.f3 = select; + pc->points[i].bez.f1 = pc->points[i].bez.f2 = pc->points[i].bez.f3 = select; } } + else { +#define SEL_F1 (1 << 0) +#define SEL_F2 (1 << 1) +#define SEL_F3 (1 << 2) + int selflag; + bool selected = false; - if (!toggle) { 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) { - pcp->bez.f2 ^= SELECT; + if (extend) + pcp->bez.f2 ^= SELECT; + else + pcp->bez.f2 = SELECT; pc->add_index = i + 1; + selflag = SEL_F2; break; } } if (len_manhattan_v2v2(loc_fl, pcp->bez.vec[0]) < PAINT_CURVE_SELECT_THRESHOLD) { - pcp->bez.f1 ^= SELECT; + if (extend) + pcp->bez.f1 ^= SELECT; + else + pcp->bez.f1 = SELECT; pc->add_index = i + 1; + selflag = SEL_F1; if (handle) pcp->bez.h1 = HD_ALIGN; break; } if (len_manhattan_v2v2(loc_fl, pcp->bez.vec[2]) < PAINT_CURVE_SELECT_THRESHOLD) { - pcp->bez.f3 ^= SELECT; + if (extend) + pcp->bez.f3 ^= SELECT; + else + pcp->bez.f3 = SELECT; pc->add_index = i + 1; + selflag = SEL_F3; 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) { + for (i = 0; i < pc->tot_points; i++) { + if ((pc->points + i) == pcp) { + switch (selflag) { + case SEL_F1: + pc->points[i].bez.f2 = pc->points[i].bez.f3 = 0; + break; + case SEL_F2: + pc->points[i].bez.f1 = pc->points[i].bez.f3 = 0; + break; + case SEL_F3: + pc->points[i].bez.f1 = pc->points[i].bez.f2 = 0; + break; + default: + /* shouldn't happen */ + break; + } + } + else { + pc->points[i].bez.f1 = pc->points[i].bez.f2 = pc->points[i].bez.f3 = 0; + } + } + } + +#undef SEL_F1 +#undef SEL_F2 +#undef SEL_F3 + + if (!selected) + return false; } WM_paint_cursor_tag_redraw(window, ar); + + return true; } @@ -445,9 +496,13 @@ static int paintcurve_select_point_invoke(bContext *C, wmOperator *op, const wmE bool handle = RNA_boolean_get(op->ptr, "handle"); bool toggle = RNA_boolean_get(op->ptr, "toggle"); bool extend = RNA_boolean_get(op->ptr, "extend"); - paintcurve_point_select(C, op, loc, handle, toggle, extend); - RNA_int_set_array(op->ptr, "location", loc); - return OPERATOR_FINISHED; + if (paintcurve_point_select(C, op, loc, handle, toggle, extend)) { + RNA_int_set_array(op->ptr, "location", loc); + return OPERATOR_FINISHED; + } + else { + return OPERATOR_CANCELLED; + } } static int paintcurve_select_point_exec(bContext *C, wmOperator *op) @@ -459,8 +514,8 @@ static int paintcurve_select_point_exec(bContext *C, wmOperator *op) bool toggle = RNA_boolean_get(op->ptr, "toggle"); bool extend = RNA_boolean_get(op->ptr, "extend"); RNA_int_get_array(op->ptr, "location", loc); - paintcurve_point_select(C, op, loc, handle, toggle, extend); - return OPERATOR_FINISHED; + if (paintcurve_point_select(C, op, loc, handle, toggle, extend)) + return OPERATOR_FINISHED; } return OPERATOR_CANCELLED; diff --git a/source/blender/editors/sculpt_paint/paint_image_2d.c b/source/blender/editors/sculpt_paint/paint_image_2d.c index 1392620..d394d6d 100644 --- a/source/blender/editors/sculpt_paint/paint_image_2d.c +++ b/source/blender/editors/sculpt_paint/paint_image_2d.c @@ -1306,15 +1306,15 @@ void paint_2d_stroke_done(void *ps) } static void paint_2d_fill_add_pixel_byte( - const int i, const int j, ImBuf *ibuf, BLI_Stack *stack, BLI_bitmap *touched, + const int x_px, const int y_px, ImBuf *ibuf, BLI_Stack *stack, BLI_bitmap *touched, const float color[4], float threshold_sq) { int coordinate; - if (i >= ibuf->x || i < 0 || j >= ibuf->y || j < 0) + if (x_px >= ibuf->x || x_px < 0 || y_px >= ibuf->y || y_px < 0) return; - coordinate = j * ibuf->x + i; + coordinate = y_px * ibuf->x + x_px; if (!BLI_BITMAP_TEST(touched, coordinate)) { float color_f[4]; @@ -1329,15 +1329,15 @@ static void paint_2d_fill_add_pixel_byte( } static void paint_2d_fill_add_pixel_float( - const int i, const int j, ImBuf *ibuf, BLI_Stack *stack, BLI_bitmap *touched, + const int x_px, const int y_px, ImBuf *ibuf, BLI_Stack *stack, BLI_bitmap *touched, const float color[4], float threshold_sq) { int coordinate; - if (i >= ibuf->x || i < 0 || j >= ibuf->y || j < 0) + if (x_px >= ibuf->x || x_px < 0 || y_px >= ibuf->y || y_px < 0) return; - coordinate = j * ibuf->x + i; + coordinate = y_px * ibuf->x + x_px; if (!BLI_BITMAP_TEST(touched, coordinate)) { if (compare_len_squared_v3v3(ibuf->rect_float + 4 * coordinate, color, threshold_sq)) { @@ -1359,7 +1359,7 @@ void paint_2d_bucket_fill( ImagePaintState *s = ps; ImBuf *ibuf; - int i, j; + int x_px, y_px; unsigned int color_b; float color_f[4]; float strength = br ? br->alpha : 1.0f; @@ -1392,18 +1392,18 @@ void paint_2d_bucket_fill( ED_imapaint_dirty_region(ima, ibuf, 0, 0, ibuf->x, ibuf->y); if (do_float) { - for (; i < ibuf->x; i++) { - for (j = 0; j < ibuf->y; j++) { - blend_color_mix_float(ibuf->rect_float + 4 * (j * ibuf->x + i), - ibuf->rect_float + 4 * (j * ibuf->x + i), color_f); + for (; x_px < ibuf->x; x_px++) { + for (y_px = 0; y_px < ibuf->y; y_px++) { + blend_color_mix_float(ibuf->rect_float + 4 * (y_px * ibuf->x + x_px), + ibuf->rect_float + 4 * (y_px * ibuf->x + x_px), color_f); } } } else { - for (; i < ibuf->x; i++) { - for (j = 0; j < ibuf->y; j++) { - blend_color_mix_byte((unsigned char *)(ibuf->rect + j * ibuf->x + i), - (unsigned char *)(ibuf->rect + j * ibuf->x + i), (unsigned char *)&color_b); + for (; x_px < ibuf->x; x_px++) { + for (y_px = 0; y_px < ibuf->y; y_px++) { + blend_color_mix_byte((unsigned char *)(ibuf->rect + y_px * ibuf->x + x_px), + (unsigned char *)(ibuf->rect + y_px * ibuf->x + x_px), (unsigned char *)&color_b); } } } @@ -1422,10 +1422,10 @@ void paint_2d_bucket_fill( UI_view2d_region_to_view(s->v2d, mouse_init[0], mouse_init[1], &image_init[0], &image_init[1]); - i = image_init[0] * ibuf->x; - j = image_init[1] * ibuf->y; + x_px = image_init[0] * ibuf->x; + y_px = image_init[1] * ibuf->y; - if (i >= ibuf->x || i < 0 || j > ibuf->y || j < 0) { + if (x_px >= ibuf->x || x_px < 0 || y_px > ibuf->y || y_px < 0) { BKE_image_release_ibuf(ima, ibuf, NULL); return; } @@ -1436,7 +1436,7 @@ void paint_2d_bucket_fill( stack = BLI_stack_new(sizeof(int), __func__); touched = BLI_BITMAP_NEW(ibuf->x * ibuf->y, "bucket_fill_bitmap"); - coordinate = (j * ibuf->x + i); + coordinate = (y_px * ibuf->x + x_px); if (do_float) { copy_v4_v4(pixel_color, ibuf->rect_float + 4 * coordinate); @@ -1458,26 +1458,26 @@ void paint_2d_bucket_fill( color_f, br->blend); /* reconstruct the coordinates here */ - i = coordinate % width; - j = coordinate / width; - - paint_2d_fill_add_pixel_float(i - 1, j - 1, ibuf, stack, touched, pixel_color, threshold_sq); - paint_2d_fill_add_pixel_float(i - 1, j, ibuf, stack, touched, pixel_color, threshold_sq); - paint_2d_fill_add_pixel_float(i - 1, j + 1, ibuf, stack, touched, pixel_color, threshold_sq); - paint_2d_fill_add_pixel_float(i, j + 1, ibuf, stack, touched, pixel_color, threshold_sq); - paint_2d_fill_add_pixel_float(i, j - 1, ibuf, stack, touched, pixel_color, threshold_sq); - paint_2d_fill_add_pixel_float(i + 1, j - 1, ibuf, stack, touched, pixel_color, threshold_sq); - paint_2d_fill_add_pixel_float(i + 1, j, ibuf, stack, touched, pixel_color, threshold_sq); - paint_2d_fill_add_pixel_float(i + 1, j + 1, ibuf, stack, touched, pixel_color, threshold_sq); - - if (i > maxx) - maxx = i; - if (i < minx) - minx = i; - if (j > maxy) - maxy = j; - if (i > miny) - miny = j; + x_px = coordinate % width; + y_px = coordinate / width; + + paint_2d_fill_add_pixel_float(x_px - 1, y_px - 1, ibuf, stack, touched, pixel_color, threshold_sq); + paint_2d_fill_add_pixel_float(x_px - 1, y_px, ibuf, stack, touched, pixel_color, threshold_sq); + paint_2d_fill_add_pixel_float(x_px - 1, y_px + 1, ibuf, stack, touched, pixel_color, threshold_sq); + paint_2d_fill_add_pixel_float(x_px, y_px + 1, ibuf, stack, touched, pixel_color, threshold_sq); + paint_2d_fil @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs