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