Commit: d6442d9881292e6c33c67317b9dfa7cc48516376
Author: Antony Riakiotakis
Date:   Wed Jul 16 16:41:21 2014 +0300
https://developer.blender.org/rBd6442d9881292e6c33c67317b9dfa7cc48516376

Finalize transform for paint curves:

Use own simple operator for slide transform, allows to return pass
through and set the cursor.

Cursor pivot not yet supported for paint curves, it will be next.

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

M       source/blender/editors/include/ED_image.h
M       source/blender/editors/include/ED_view3d.h
M       source/blender/editors/sculpt_paint/paint_curve.c
M       source/blender/editors/sculpt_paint/paint_intern.h
M       source/blender/editors/sculpt_paint/paint_ops.c
M       source/blender/editors/space_image/image_edit.c
M       source/blender/editors/space_image/space_image.c
M       source/blender/editors/space_view3d/view3d_edit.c
M       source/blender/editors/transform/transform_conversions.c
M       source/blender/editors/uvedit/uvedit_ops.c

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

diff --git a/source/blender/editors/include/ED_image.h 
b/source/blender/editors/include/ED_image.h
index 14b78f2..db13c62 100644
--- a/source/blender/editors/include/ED_image.h
+++ b/source/blender/editors/include/ED_image.h
@@ -72,6 +72,8 @@ bool ED_space_image_show_uvedit(struct SpaceImage *sima, 
struct Object *obedit);
 bool ED_space_image_show_texpaint(struct SpaceImage *sima, struct Object *ob);
 bool ED_space_image_show_uvshadow(struct SpaceImage *sima, struct Object 
*obedit);
 
+bool ED_space_image_paint_curve(const struct bContext *C);
+
 bool ED_space_image_check_show_maskedit(struct Scene *scene, struct SpaceImage 
*sima);
 int ED_space_image_maskedit_poll(struct bContext *C);
 int ED_space_image_maskedit_mask_poll(struct bContext *C);
diff --git a/source/blender/editors/include/ED_view3d.h 
b/source/blender/editors/include/ED_view3d.h
index 7683974..3bb49ab 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -84,6 +84,7 @@ typedef struct ViewDepths {
 
 float *ED_view3d_cursor3d_get(struct Scene *scene, struct View3D *v3d);
 void   ED_view3d_cursor3d_position(struct bContext *C, float fp[3], const int 
mval[2]);
+void   ED_view3d_cursor3d_update(struct bContext *C, const int *mval);
 
 struct Camera *ED_view3d_camera_data_get(struct View3D *v3d, struct 
RegionView3D *rv3d);
 
diff --git a/source/blender/editors/sculpt_paint/paint_curve.c 
b/source/blender/editors/sculpt_paint/paint_curve.c
index 37df94a..ca608b4 100644
--- a/source/blender/editors/sculpt_paint/paint_curve.c
+++ b/source/blender/editors/sculpt_paint/paint_curve.c
@@ -41,6 +41,7 @@
 #include "BLI_string.h"
 
 #include "ED_paint.h"
+#include "ED_view3d.h"
 
 #include "WM_api.h"
 #include "WM_types.h"
@@ -48,9 +49,13 @@
 #include "RNA_access.h"
 #include "RNA_define.h"
 
+#include "UI_view2d.h"
+
 #include "paint_intern.h"
 
 #define PAINT_CURVE_SELECT_THRESHOLD 40.0f
+#define PAINT_CURVE_POINT_SELECT(pcp, i) (*(&pcp->bez.f1 + i) = SELECT)
+
 
 int paint_curve_poll(bContext *C)
 {
@@ -207,6 +212,15 @@ static PaintCurvePoint 
*paintcurve_point_get_closest(PaintCurve *pc, const float
        return closest;
 }
 
+static int paintcurve_point_co_index(char sel)
+{
+       char i = 0;
+       while (sel != 1) {
+               sel >>= 1;
+               i++;
+       }
+       return i;
+}
 
 /******************* Operators *********************************/
 
@@ -409,8 +423,7 @@ void PAINTCURVE_OT_delete_point(wmOperatorType *ot)
 }
 
 
-static bool paintcurve_point_select(bContext *C, wmOperator *op, const int 
loc[2],
-                                    bool handle, bool toggle, bool extend)
+static bool paintcurve_point_select(bContext *C, wmOperator *op, const int 
loc[2], bool toggle, bool extend)
 {
        wmWindow *window = CTX_wm_window(C);
        ARegion *ar = CTX_wm_region(C);
@@ -453,47 +466,39 @@ static bool paintcurve_point_select(bContext *C, 
wmOperator *op, const int loc[2
                PaintCurvePoint *pcp;
                char selflag;
 
-               pcp = paintcurve_point_get_closest(pc, loc_fl, handle, 
PAINT_CURVE_SELECT_THRESHOLD, &selflag);
+               pcp = paintcurve_point_get_closest(pc, loc_fl, false, 
PAINT_CURVE_SELECT_THRESHOLD, &selflag);
 
                if (pcp) {
                        pc->add_index = (pcp - pc->points) + 1;
 
                        if (selflag == SEL_F2) {
-                               pcp->bez.f2 |= SELECT;
+                               if (extend)
+                                       pcp->bez.f2 ^= SELECT;
+                               else
+                                       pcp->bez.f2 |= SELECT;
                        }
                        else if (selflag == SEL_F1) {
-                               pcp->bez.f1 |= SELECT;
-                               if (handle)
-                                       pcp->bez.h1 = HD_ALIGN;
+                               if (extend)
+                                       pcp->bez.f1 ^= SELECT;
+                               else
+                                       pcp->bez.f1 |= SELECT;
                        }
                        else if (selflag == SEL_F3) {
-                               pcp->bez.f3 |= SELECT;
-                               if (handle)
-                                       pcp->bez.h2 = HD_ALIGN;
+                               if (extend)
+                                       pcp->bez.f3 ^= SELECT;
+                               else
+                                       pcp->bez.f3 |= SELECT;
                        }
                }
 
                /* clear selection for unselected points if not extending and 
if a point has been selected */
                if (!extend && pcp) {
                        for (i = 0; i < pc->tot_points; i++) {
+                               pc->points[i].bez.f1 = pc->points[i].bez.f2 = 
pc->points[i].bez.f3 = 0;
+
                                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;
+                                       char index = 
paintcurve_point_co_index(selflag);
+                                       PAINT_CURVE_POINT_SELECT(pcp, index);
                                }
                        }
                }
@@ -510,11 +515,10 @@ static bool paintcurve_point_select(bContext *C, 
wmOperator *op, const int loc[2
 
 static int paintcurve_select_point_invoke(bContext *C, wmOperator *op, const 
wmEvent *event)
 {
-       int loc[2] = {event->mval[0], event->mval[1]};
-       bool handle = RNA_boolean_get(op->ptr, "handle");
+       int loc[2] = {UNPACK2(event->mval)};
        bool toggle = RNA_boolean_get(op->ptr, "toggle");
        bool extend = RNA_boolean_get(op->ptr, "extend");
-       if (paintcurve_point_select(C, op, loc, handle, toggle, extend)) {
+       if (paintcurve_point_select(C, op, loc, toggle, extend)) {
                RNA_int_set_array(op->ptr, "location", loc);
                return OPERATOR_FINISHED;
        }
@@ -528,11 +532,10 @@ static int paintcurve_select_point_exec(bContext *C, 
wmOperator *op)
        int loc[2];
 
        if (RNA_struct_property_is_set(op->ptr, "location")) {
-               bool handle = RNA_boolean_get(op->ptr, "handle");
                bool toggle = RNA_boolean_get(op->ptr, "toggle");
                bool extend = RNA_boolean_get(op->ptr, "extend");
                RNA_int_get_array(op->ptr, "location", loc);
-               if (paintcurve_point_select(C, op, loc, handle, toggle, extend))
+               if (paintcurve_point_select(C, op, loc, toggle, extend))
                        return OPERATOR_FINISHED;
        }
 
@@ -563,10 +566,140 @@ void PAINTCURVE_OT_select(wmOperatorType *ot)
        RNA_def_property_flag(prop, PROP_SKIP_SAVE);
        prop = RNA_def_boolean(ot->srna, "extend", false, "Extend", "Extend 
selection");
        RNA_def_property_flag(prop, PROP_SKIP_SAVE);
-       prop = RNA_def_boolean(ot->srna, "handle", false, "Handle", "Prefer 
handle selection");
-       RNA_def_property_flag(prop, PROP_SKIP_SAVE);
 }
 
+typedef struct PointSlideData {
+       PaintCurvePoint *pcp;
+       char select;
+       int initial_loc[2];
+       float point_initial_loc[3][2];
+       int event;
+       bool align;
+} PointSlideData;
+
+static int paintcurve_slide_invoke(bContext *C, wmOperator *op, const wmEvent 
*event)
+{
+       Paint *p = BKE_paint_get_active_from_context(C);
+       const float loc_fl[2] = {UNPACK2(event->mval)};
+       char select;
+       int i;
+       bool do_select = RNA_boolean_get(op->ptr, "select");
+       bool align = RNA_boolean_get(op->ptr, "align");
+       Brush *br = p->brush;
+       PaintCurve *pc = br->paint_curve;
+       PaintCurvePoint *pcp;
+
+       if (!pc)
+               return OPERATOR_PASS_THROUGH;
+
+       if (do_select) {
+               pcp = paintcurve_point_get_closest(pc, loc_fl, align, 
PAINT_CURVE_SELECT_THRESHOLD, &select);
+       }
+       else {
+               /* 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) {
+                               pcp = &pc->points[i];
+                               select = SEL_F3;
+                               break;
+                       }
+               }
+       }
+
+
+       if (pcp) {
+               ARegion *ar = CTX_wm_region(C);
+               wmWindow *window = CTX_wm_window(C);
+               PointSlideData *psd = MEM_mallocN(sizeof(PointSlideData), 
"PointSlideData");
+               copy_v2_v2_int(psd->initial_loc, event->mval);
+               psd->event = event->type;
+               psd->pcp = pcp;
+               psd->select = paintcurve_point_co_index(select);
+               for (i = 0; i < 3; i++) {
+                       copy_v2_v2(psd->point_initial_loc[i], pcp->bez.vec[i]);
+               }
+               psd->align = align;
+               op->customdata = psd;
+
+               paintcurve_undo_begin(C, op, pc);
+
+               /* first, clear all selection from points */
+               for (i = 0; i < pc->tot_points; i++)
+                       pc->points[i].bez.f1 = pc->points[i].bez.f3 = 
pc->points[i].bez.f2 = 0;
+
+               /* only select the active point */
+               PAINT_CURVE_POINT_SELECT(pcp, psd->select);
+               pc->add_index = (pcp - pc->points) + 1;
+
+               WM_event_add_modal_handler(C, op);
+               WM_paint_cursor_tag_redraw(window, ar);
+               return OPERATOR_RUNNING_MODAL;
+       }
+
+       return OPERATOR_PASS_THROUGH;
+}
+
+static int paintcurve_slide_modal(bContext *C, wmOperator *op, const wmEvent 
*event)
+{
+       PointSlideData *psd = op->customdata;
+
+       if (event->type == psd->event && event->val == KM_RELEASE) {
+               MEM_freeN(psd);
+               return OPERATOR_FINISHED;
+       }
+
+       switch (event->type) {
+               case MOUSEMOVE:
+               {
+                       ARegion *ar = CTX_wm_region(C);
+                       wmWindow *window = CTX_wm_window(C);
+                       float diff[2] = {event->mval[0] - psd->initial_loc[0],
+                                        event->mval[1] - psd->initial_loc[1]};
+                       if (psd->select == 1) {
+                               int i;
+                               for (i = 0; i < 3; i++)
+                                       add_v2_v2v2(psd->pcp->bez.vec[i], diff, 
psd->point_initial_loc[i]);
+                       }
+                       else {
+                               add_v2_v2(diff, 
psd->point_initial_loc[psd->select]);
+                               copy_v2_v2(psd->pcp->bez.vec[psd->select], 
diff);
+
+                               if (psd->align) {
+                                       char opposite = (psd->select == 0) ? 2 
: 0;
+                                       sub_v2_v2v2(diff, psd->pcp->bez.vec[1], 
psd->pcp->bez.vec[psd->select]);
+                                       
add_v2_v2v2(psd->pcp->bez.vec[opposite], psd->pcp->bez.vec[1], diff);
+                               }
+                       }
+                       WM_paint_cursor_tag_redraw(window, ar);
+                       break;
+               }
+               default:
+                       break;
+       }
+
+       return OPERATOR_RUNNING_MODAL;
+}
+
+
+void PAINTCURVE_OT_slide(wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name = "Slide Paint Curve Point";
+       ot->description = "Select and slide paint curve point";
+       ot->idname = "PAINTCURVE_OT_slide";
+
+       /* api callbacks */
+       ot->invoke = paintcurve_slide_invoke;
+       ot->modal = paintcurve_slide_modal;
+       ot->poll = paint_curve_poll;
+
+       /* flags */
+       ot->flag = OPTYPE_UNDO;
+
+       /* properties */
+       RNA_def_boolean(ot->srna, "align", false, "Align Handles", "Aligns 
opposite point handle during transform");
+       RNA_def_boolean(ot->srna, "select", true, "Select", "Attempt to select 
a point handle before transform");
+}
 
 static int paintcurve_draw_exec(bContext *C, wmOperator *UNUSED(op))
 {
@@ -591,7 +724,7 @@ static int paintcurve_draw_exec(bContext *C, wmOperator 
*UNUSED(op))
                        return OPERATOR_PASS_THROUGH;
        }
 
-       return  WM_operator_name_call(C, name, WM_OP_INVOKE_DEFAULT, NULL);
+       return WM_operator_name_call(C, name, WM_OP_INVO

@@ 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

Reply via email to