Commit: 6e56dcdc7920a896588e770c7db493ff99afeeb6
Author: Antony Riakiotakis
Date:   Wed Nov 12 15:41:24 2014 +0100
Branches: wiggly-widgets
https://developer.blender.org/rB6e56dcdc7920a896588e770c7db493ff99afeeb6

Change widget interaction slightly so transform works immediately.

It may be better to use transform code for widgets but this will cause
nested operators for widget/operator and needs some consideration.

For transform e.g. we would have one transform operator taking care of
transformation of the widget, then feeding this back to regular object
transform.

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

M       source/blender/editors/transform/transform_ops.c
M       source/blender/windowmanager/intern/wm_event_system.c
M       source/blender/windowmanager/intern/wm_generic_widgets.c
M       source/blender/windowmanager/intern/wm_widgets.c

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

diff --git a/source/blender/editors/transform/transform_ops.c 
b/source/blender/editors/transform/transform_ops.c
index 22bb3ad..d250843 100644
--- a/source/blender/editors/transform/transform_ops.c
+++ b/source/blender/editors/transform/transform_ops.c
@@ -81,6 +81,7 @@ static char OP_EDGE_CREASE[] = "TRANSFORM_OT_edge_crease";
 static char OP_EDGE_BWEIGHT[] = "TRANSFORM_OT_edge_bevelweight";
 static char OP_SEQ_SLIDE[] = "TRANSFORM_OT_seq_slide";
 
+
 static void TRANSFORM_OT_translate(struct wmOperatorType *ot);
 static void TRANSFORM_OT_rotate(struct wmOperatorType *ot);
 static void TRANSFORM_OT_tosphere(struct wmOperatorType *ot);
diff --git a/source/blender/windowmanager/intern/wm_event_system.c 
b/source/blender/windowmanager/intern/wm_event_system.c
index bdcc302..62bf856 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -1578,11 +1578,13 @@ static int wm_handler_operator_call(bContext *C, 
ListBase *handlers, wmEventHand
                        /* if a widget has called the operator, it swallows all 
events here */
                        if (handler->op_widget) {
                                wmWidget *widget = handler->op_widget;
+                               retval = OPERATOR_RUNNING_MODAL;
 
                                switch (event->type) {
                                        case MOUSEMOVE:
                                                if (widget->handler(C, event, 
widget, op) == OPERATOR_PASS_THROUGH) {
-                                                       event->type = 
EVT_WIDGET_UPDATE;
+                                                       if (widget->prop)
+                                                               event->type = 
EVT_WIDGET_UPDATE;
                                                        retval = ot->modal(C, 
op, event);
                                                }
                                                break;
@@ -1591,13 +1593,19 @@ static int wm_handler_operator_call(bContext *C, 
ListBase *handlers, wmEventHand
                                        {
                                                if (event->val == KM_RELEASE) {
                                                        ARegion *ar = 
CTX_wm_region(C);
-                                                       event->type = 
EVT_WIDGET_RELEASED;
+                                                       if (widget->prop)
+                                                               event->type = 
EVT_WIDGET_RELEASED;
                                                        retval = ot->modal(C, 
op, event);
                                                        
wm_widgetmap_set_active_widget(ar->widgetmap, C, event, NULL);
                                                        handler->op_widget = 
NULL;
                                                }
                                                break;
                                        }
+                                       default:
+                                               if (!widget->prop) {
+                                                       retval = ot->modal(C, 
op, event);
+                                               }
+                                               break;
                                }
                        }
                        else {
diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c 
b/source/blender/windowmanager/intern/wm_generic_widgets.c
index e903212..eb75a85 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -162,14 +162,9 @@ static void arrow_draw_intern(ArrowWidget *arrow, bool 
select, bool highlight, f
        float up[3] = {0.0f, 0.0f, 1.0f};
        float final_pos[3];
 
-       if (arrow->widget.prop) {
-               copy_v3_v3(final_pos, arrow->direction);
-               mul_v3_fl(final_pos, scale * arrow->offset);
-               add_v3_v3(final_pos, arrow->widget.origin);
-       }
-       else {
-               copy_v3_v3(final_pos, arrow->widget.origin);
-       }
+       copy_v3_v3(final_pos, arrow->direction);
+       mul_v3_fl(final_pos, scale * arrow->offset);
+       add_v3_v3(final_pos, arrow->widget.origin);
 
        rotation_between_vecs_to_mat3(rot, up, arrow->direction);
        copy_m4_m3(mat, rot);
@@ -191,14 +186,10 @@ static void arrow_draw_intern(ArrowWidget *arrow, bool 
select, bool highlight, f
        if (arrow->widget.interaction_data) {
                ArrowInteraction *data = arrow->widget.interaction_data;
 
-               if (arrow->widget.prop) {
-                       copy_v3_v3(final_pos, arrow->direction);
-                       mul_v3_fl(final_pos, scale * data->orig_offset);
-                       add_v3_v3(final_pos, arrow->widget.origin);
-               }
-               else {
-                       copy_v3_v3(final_pos, arrow->widget.origin);
-               }
+               copy_v3_v3(final_pos, arrow->direction);
+               mul_v3_fl(final_pos, scale * data->orig_offset);
+               add_v3_v3(final_pos, arrow->widget.origin);
+
                copy_m4_m3(mat, rot);
                copy_v3_v3(mat[3], final_pos);
                mul_mat3_m4_fl(mat, scale);
@@ -282,20 +273,17 @@ static int widget_arrow_handler(struct bContext *C, const 
struct wmEvent *event,
        fac = len_v3(orig_origin) / len_v3(offset);
        if (dot_v3v3(offset, orig_origin) < 0.0f)
                facdir = -1.0;
-       fac *= facdir / widget->scale;
+       fac *= facdir;
        mul_v3_v3fl(orig_origin, offset, fac);
-       add_v3_v3(orig_origin, data->orig_origin);
 
        /* set the property for the operator and call its modal function */
        if (op && widget->propname) {
-               copy_v3_v3(widget->origin, orig_origin);
-               RNA_float_set_array(op->ptr, widget->propname, widget->origin);
+
        }
        else if (widget->prop) {
                float value;
-               sub_v3_v3(orig_origin, data->orig_origin);
 
-               value = data->orig_offset + facdir * len_v3(orig_origin);
+               value = data->orig_offset + facdir / widget->scale * 
len_v3(orig_origin);
                if (arrow->style & UI_ARROW_STYLE_CONSTRAINED) {
                        if (arrow->style & UI_ARROW_STYLE_INVERTED)
                                value = arrow->min + arrow->range - (value * 
arrow->range / ARROW_RANGE);
@@ -317,6 +305,9 @@ static int widget_arrow_handler(struct bContext *C, const 
struct wmEvent *event,
                else
                        arrow->offset = RNA_property_float_get(widget->ptr, 
widget->prop);
        }
+       else {
+               arrow->offset = facdir / widget->scale * len_v3(orig_origin);
+       }
 
        /* tag the region for redraw */
        ED_region_tag_redraw(ar);
@@ -353,21 +344,25 @@ static void widget_arrow_bind_to_prop(struct wmWidget 
*widget)
 {
        ArrowWidget *arrow = (ArrowWidget *) widget;
 
-       if (arrow->style & UI_ARROW_STYLE_CONSTRAINED) {
-               float min, max, step, precision;
+       if (widget->prop) {
+               if (arrow->style & UI_ARROW_STYLE_CONSTRAINED) {
+                       float min, max, step, precision;
 
-               RNA_property_float_ui_range(widget->ptr, widget->prop, &min, 
&max, &step, &precision);
-               arrow->range = max - min;
-               arrow->min = min;
-               if (arrow->style & UI_ARROW_STYLE_INVERTED)
-                       arrow->offset = ARROW_RANGE * (max - 
(RNA_property_float_get(widget->ptr, widget->prop))) / arrow->range;
-               else
-                       arrow->offset = ARROW_RANGE * 
((RNA_property_float_get(widget->ptr, widget->prop) - arrow->min) / 
arrow->range);
-       }
-       else {
-               /* we'd need to check the property type here but for now assume 
always float */
-               arrow->offset = RNA_property_float_get(widget->ptr, 
widget->prop);
+                       RNA_property_float_ui_range(widget->ptr, widget->prop, 
&min, &max, &step, &precision);
+                       arrow->range = max - min;
+                       arrow->min = min;
+                       if (arrow->style & UI_ARROW_STYLE_INVERTED)
+                               arrow->offset = ARROW_RANGE * (max - 
(RNA_property_float_get(widget->ptr, widget->prop))) / arrow->range;
+                       else
+                               arrow->offset = ARROW_RANGE * 
((RNA_property_float_get(widget->ptr, widget->prop) - arrow->min) / 
arrow->range);
+               }
+               else {
+                       /* we'd need to check the property type here but for 
now assume always float */
+                       arrow->offset = RNA_property_float_get(widget->ptr, 
widget->prop);
+               }
        }
+       else
+               arrow->offset = 0.0f;
 }
 
 wmWidget *WIDGET_arrow_new(int style, void *customdata)
diff --git a/source/blender/windowmanager/intern/wm_widgets.c 
b/source/blender/windowmanager/intern/wm_widgets.c
index e5bb73b..a6d0ba8 100644
--- a/source/blender/windowmanager/intern/wm_widgets.c
+++ b/source/blender/windowmanager/intern/wm_widgets.c
@@ -207,6 +207,9 @@ void WM_widget_operator(struct wmWidget *widget,
        widget->initialize_op = initialize_op;
        widget->opname = opname;
        widget->propname = propname;
+
+       if (widget->bind_to_prop)
+               widget->bind_to_prop(widget);
 }

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

Reply via email to