Commit: 890e533c7695927212a6164c0ca86ff7a314bf5f
Author: Campbell Barton
Date:   Mon Apr 13 19:27:10 2015 +1000
Branches: master
https://developer.blender.org/rB890e533c7695927212a6164c0ca86ff7a314bf5f

Fix adding to paint-curves from the first point

- add_index now works when selecting the first point.
- sliding now selects the correct handle.

===================================================================

M       source/blender/blenkernel/BKE_paint.h
M       source/blender/blenkernel/intern/paint.c
M       source/blender/editors/sculpt_paint/paint_curve.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_paint.h 
b/source/blender/blenkernel/BKE_paint.h
index 4d71344..53c2a82 100644
--- a/source/blender/blenkernel/BKE_paint.h
+++ b/source/blender/blenkernel/BKE_paint.h
@@ -120,6 +120,7 @@ void BKE_paint_brush_set(struct Paint *paint, struct Brush 
*br);
 struct Palette *BKE_paint_palette(struct Paint *paint);
 void BKE_paint_palette_set(struct Paint *p, struct Palette *palette);
 void BKE_paint_curve_set(struct Brush *br, struct PaintCurve *pc);
+void BKE_paint_curve_clamp_endpoint_add_index(struct PaintCurve *pc, const int 
add_index);
 
 void BKE_paint_data_warning(struct ReportList *reports, bool uvs, bool mat, 
bool tex, bool stencil);
 bool BKE_paint_proj_mesh_data_check(struct Scene *scene, struct Object *ob, 
bool *uvs, bool *mat, bool *tex, bool *stencil);
diff --git a/source/blender/blenkernel/intern/paint.c 
b/source/blender/blenkernel/intern/paint.c
index a5b6087..b45e6b8 100644
--- a/source/blender/blenkernel/intern/paint.c
+++ b/source/blender/blenkernel/intern/paint.c
@@ -313,6 +313,11 @@ void BKE_paint_curve_set(Brush *br, PaintCurve *pc)
        }
 }
 
+void BKE_paint_curve_clamp_endpoint_add_index(PaintCurve *pc, const int 
add_index)
+{
+       pc->add_index = (add_index || pc->tot_points == 1) ? (add_index + 1) : 
0;
+}
+
 /* remove colour from palette. Must be certain color is inside the palette! */
 void BKE_palette_color_remove(Palette *palette, PaletteColor *color)
 {
diff --git a/source/blender/editors/sculpt_paint/paint_curve.c 
b/source/blender/editors/sculpt_paint/paint_curve.c
index 439c2a6..8c754d7 100644
--- a/source/blender/editors/sculpt_paint/paint_curve.c
+++ b/source/blender/editors/sculpt_paint/paint_curve.c
@@ -222,6 +222,28 @@ static int paintcurve_point_co_index(char sel)
        return i;
 }
 
+static char paintcurve_point_side_index(const BezTriple *bezt, const bool 
is_first, const char fallback)
+{
+       /* when matching, guess based on endpoint side */
+       if (BEZSELECTED(bezt)) {
+               if ((bezt->f1 & SELECT) == (bezt->f3 & SELECT)) {
+                       return is_first ? SEL_F1 : SEL_F3;
+               }
+               else if (bezt->f1 & SELECT) {
+                       return SEL_F1;
+               }
+               else if (bezt->f3  & SELECT) {
+                       return SEL_F3;
+               }
+               else {
+                       return fallback;
+               }
+       }
+       else {
+               return 0;
+       }
+}
+
 /******************* Operators *********************************/
 
 static int paintcurve_new_exec(bContext *C, wmOperator *UNUSED(op))
@@ -295,10 +317,17 @@ static void paintcurve_point_add(bContext *C,  wmOperator 
*op, const int loc[2])
        for (i = 0; i < pc->tot_points; i++) {
                pcp[i].bez.f1 = pcp[i].bez.f2 = pcp[i].bez.f3 = 0;
        }
-       pcp[add_index].bez.f3 = SELECT;
-       pcp[add_index].bez.h2 = HD_ALIGN;
 
-       pc->add_index = add_index + 1;
+       BKE_paint_curve_clamp_endpoint_add_index(pc, add_index);
+
+       if (pc->add_index != 0) {
+               pcp[add_index].bez.f3 = SELECT;
+               pcp[add_index].bez.h2 = HD_ALIGN;
+       }
+       else {
+               pcp[add_index].bez.f1 = SELECT;
+               pcp[add_index].bez.h1 = HD_ALIGN;
+       }
 
        WM_paint_cursor_tag_redraw(window, ar);
 }
@@ -384,7 +413,7 @@ static int paintcurve_delete_point_exec(bContext *C, 
wmOperator *op)
                                points_new[j] = pc->points[i];
 
                                if ((i + 1) == pc->add_index) {
-                                       pc->add_index = j + 1;
+                                       
BKE_paint_curve_clamp_endpoint_add_index(pc, j);
                                }
                                j++;
                        }
@@ -469,7 +498,7 @@ static bool paintcurve_point_select(bContext *C, wmOperator 
*op, const int loc[2
                pcp = paintcurve_point_get_closest(pc, loc_fl, false, 
PAINT_CURVE_SELECT_THRESHOLD, &selflag);
 
                if (pcp) {
-                       pc->add_index = (pcp - pc->points) + 1;
+                       BKE_paint_curve_clamp_endpoint_add_index(pc, pcp - 
pc->points);
 
                        if (selflag == SEL_F2) {
                                if (extend)
@@ -599,9 +628,8 @@ static int paintcurve_slide_invoke(bContext *C, wmOperator 
*op, const wmEvent *e
                pcp = NULL;
                /* just find first selected point */
                for (i = 0; i < pc->tot_points; i++) {
-                       if (pc->points[i].bez.f1 || pc->points[i].bez.f2 || 
pc->points[i].bez.f3) {
+                       if ((select = 
paintcurve_point_side_index(&pc->points[i].bez, i == 0, SEL_F3))) {
                                pcp = &pc->points[i];
-                               select = SEL_F3;
                                break;
                        }
                }
@@ -631,7 +659,7 @@ static int paintcurve_slide_invoke(bContext *C, wmOperator 
*op, const wmEvent *e
 
                /* only select the active point */
                PAINT_CURVE_POINT_SELECT(pcp, psd->select);
-               pc->add_index = (pcp - pc->points) + 1;
+               BKE_paint_curve_clamp_endpoint_add_index(pc, pcp - pc->points);
 
                WM_event_add_modal_handler(C, op);
                WM_paint_cursor_tag_redraw(window, ar);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to