[Bf-blender-cvs] [6e56dcd] wiggly-widgets: Change widget interaction slightly so transform works immediately.

Antony Riakiotakis noreply at git.blender.org
Wed Nov 12 15:41:32 CET 2014


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);
 }




More information about the Bf-blender-cvs mailing list