Commit: aa22fa21f9f41fb5c21c17e10c2449b4b305478f
Author: Antony Riakiotakis
Date:   Wed Nov 12 12:00:12 2014 +0100
Branches: wiggly-widgets
https://developer.blender.org/rBaa22fa21f9f41fb5c21c17e10c2449b4b305478f

Widgets: inverted/constrained to property range working for properties
(not operators yet).

Now "umbrella" widget type works correctly.

Includes minor cleanup of view3d widgetgroup routines.

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

M       source/blender/editors/include/ED_transform.h
M       source/blender/editors/include/ED_view3d.h
M       source/blender/editors/object/object_lamp.c
M       source/blender/editors/space_view3d/space_view3d.c
M       source/blender/editors/transform/transform_manipulator.c
M       source/blender/windowmanager/WM_api.h
M       source/blender/windowmanager/intern/wm_generic_widgets.c

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

diff --git a/source/blender/editors/include/ED_transform.h 
b/source/blender/editors/include/ED_transform.h
index ee88000..d36472e 100644
--- a/source/blender/editors/include/ED_transform.h
+++ b/source/blender/editors/include/ED_transform.h
@@ -175,6 +175,7 @@ void WIDGET_manipulator_draw(struct wmWidget *widget, const 
struct bContext *C);
 bool WIDGETGROUP_manipulator_poll(struct wmWidgetGroup *wgroup, const struct 
bContext *C);
 void WIDGETGROUP_manipulator_update(struct wmWidgetGroup *wgroup, const struct 
bContext *C);
 void WIDGETGROUP_manipulator_free(struct wmWidgetGroup *wgroup);
+void WIDGETGROUP_manipulator_create(struct wmWidgetGroup *wgroup);
 
 /* Snapping */
 
diff --git a/source/blender/editors/include/ED_view3d.h 
b/source/blender/editors/include/ED_view3d.h
index 92c163a..592448f 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -377,6 +377,7 @@ typedef struct WidgetGroupLamp {
 bool WIDGETGROUP_lamp_poll(struct wmWidgetGroup *wgroup, const struct bContext 
*C);
 void WIDGETGROUP_lamp_update(struct wmWidgetGroup *wgroup, const struct 
bContext *C);
 void WIDGETGROUP_lamp_free(struct wmWidgetGroup *wgroup);
+void WIDGETGROUP_lamp_create(struct wmWidgetGroup *wgroup);
 
 /* render */
 void ED_view3d_shade_update(struct Main *bmain, struct Scene *scene, struct 
View3D *v3d, struct ScrArea *sa);
diff --git a/source/blender/editors/object/object_lamp.c 
b/source/blender/editors/object/object_lamp.c
index 11db061..162920c 100644
--- a/source/blender/editors/object/object_lamp.c
+++ b/source/blender/editors/object/object_lamp.c
@@ -236,3 +236,17 @@ void WIDGETGROUP_lamp_free(struct wmWidgetGroup *wgroup)
        MEM_freeN(data);
 }
 
+void WIDGETGROUP_lamp_create(struct wmWidgetGroup *wgroup)
+{
+       float color_lamp[4] = {0.5f, 0.5f, 1.0f, 1.0f};
+       wmWidget *widget = NULL;
+       WidgetGroupLamp *lampgroup = MEM_callocN(sizeof(WidgetGroupLamp), 
"lamp_manipulator_data");
+
+       lampgroup->lamp = MEM_callocN(sizeof(PointerRNA), "lampwidgetptr");
+
+       widget = WIDGET_arrow_new(UI_ARROW_STYLE_INVERTED, NULL);
+       WM_widget_register(wgroup, widget);
+       WIDGET_arrow_set_color(widget, color_lamp);
+
+       WM_widgetgroup_customdata_set(wgroup, lampgroup);
+}
diff --git a/source/blender/editors/space_view3d/space_view3d.c 
b/source/blender/editors/space_view3d/space_view3d.c
index 1ddb1d7..60da4ec 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -694,67 +694,6 @@ static void view3d_dropboxes(void)
        WM_dropbox_add(lb, "OBJECT_OT_group_instance_add", 
view3d_group_drop_poll, view3d_group_drop_copy);     
 }
 
-static void WIDGETGROUP_manipulator_create(struct wmWidgetGroup *wgroup)
-{
-       float color_green[4] = {0.0f, 1.0f, 0.0f, 1.0f};
-       float color_red[4] = {1.0f, 0.0f, 0.0f, 1.0f};
-       float color_blue[4] = {0.0f, 0.0f, 1.0f, 1.0f};
-
-       wmWidget *widget = NULL;
-
-       ManipulatorGroup *manipulator = MEM_callocN(sizeof(ManipulatorGroup), 
"manipulator_data");
-
-       widget = WM_widget_new(WIDGET_manipulator_draw,
-                              WIDGET_manipulator_render_3d_intersect,
-                              NULL,
-                              WIDGET_manipulator_handler,
-                              NULL, false);
-
-       WM_widget_register(wgroup, widget);
-
-       manipulator->translate_x = WIDGET_arrow_new(0, NULL);
-       WIDGET_arrow_set_color(manipulator->translate_x, color_red);
-       WM_widget_register(wgroup, manipulator->translate_x);
-
-       manipulator->translate_y = WIDGET_arrow_new(0, SET_INT_IN_POINTER(1));
-       WIDGET_arrow_set_color(manipulator->translate_y, color_green);
-       WM_widget_register(wgroup, manipulator->translate_y);
-
-       manipulator->translate_z = WIDGET_arrow_new(0, SET_INT_IN_POINTER(2));
-       WIDGET_arrow_set_color(manipulator->translate_z, color_blue);
-       WM_widget_register(wgroup, manipulator->translate_z);
-
-       manipulator->rotate_x = WIDGET_dial_new(UI_DIAL_STYLE_RING_CLIPPED, 
NULL);
-       WIDGET_dial_set_color(manipulator->rotate_x, color_red);
-       WM_widget_register(wgroup, manipulator->rotate_x);
-
-       manipulator->rotate_y = WIDGET_dial_new(UI_DIAL_STYLE_RING_CLIPPED, 
SET_INT_IN_POINTER(1));
-       WIDGET_dial_set_color(manipulator->rotate_y, color_green);
-       WM_widget_register(wgroup, manipulator->rotate_y);
-
-       manipulator->rotate_z = WIDGET_dial_new(UI_DIAL_STYLE_RING_CLIPPED, 
SET_INT_IN_POINTER(2));
-       WIDGET_dial_set_color(manipulator->rotate_z, color_blue);
-       WM_widget_register(wgroup, manipulator->rotate_z);
-
-       WM_widgetgroup_customdata_set(wgroup, manipulator);
-}
-
-static void WIDGETGROUP_lamp_create(struct wmWidgetGroup *wgroup)
-{
-       float color_lamp[4] = {0.5f, 0.5f, 1.0f, 1.0f};
-       wmWidget *widget = NULL;
-       WidgetGroupLamp *lampgroup = MEM_callocN(sizeof(WidgetGroupLamp), 
"lamp_manipulator_data");
-
-       lampgroup->lamp = MEM_callocN(sizeof(PointerRNA), "lampwidgetptr");
-
-       widget = WIDGET_arrow_new(UI_ARROW_STYLE_INVERTED, NULL);
-       WM_widget_register(wgroup, widget);
-       WIDGET_arrow_set_color(widget, color_lamp);
-
-       WM_widgetgroup_customdata_set(wgroup, lampgroup);
-}
-
-
 static void view3d_widgets(void)
 {
        struct wmWidgetMapType *wmaptype = WM_widgetmaptype_find("View3D", 
SPACE_VIEW3D, RGN_TYPE_WINDOW, true);
diff --git a/source/blender/editors/transform/transform_manipulator.c 
b/source/blender/editors/transform/transform_manipulator.c
index 20340be..f04edd4 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -2037,4 +2037,49 @@ void WIDGETGROUP_manipulator_free(struct wmWidgetGroup 
*wgroup)
        ManipulatorGroup *manipulator = WM_widgetgroup_customdata(wgroup);
 
        MEM_freeN(manipulator);
-}
\ No newline at end of file
+}
+
+void WIDGETGROUP_manipulator_create(struct wmWidgetGroup *wgroup)
+{
+       float color_green[4] = {0.0f, 1.0f, 0.0f, 1.0f};
+       float color_red[4] = {1.0f, 0.0f, 0.0f, 1.0f};
+       float color_blue[4] = {0.0f, 0.0f, 1.0f, 1.0f};
+
+       wmWidget *widget = NULL;
+
+       ManipulatorGroup *manipulator = MEM_callocN(sizeof(ManipulatorGroup), 
"manipulator_data");
+
+       widget = WM_widget_new(WIDGET_manipulator_draw,
+                              WIDGET_manipulator_render_3d_intersect,
+                              NULL,
+                              WIDGET_manipulator_handler,
+                              NULL, false);
+
+       WM_widget_register(wgroup, widget);
+
+       manipulator->translate_x = WIDGET_arrow_new(0, NULL);
+       WIDGET_arrow_set_color(manipulator->translate_x, color_red);
+       WM_widget_register(wgroup, manipulator->translate_x);
+
+       manipulator->translate_y = WIDGET_arrow_new(0, SET_INT_IN_POINTER(1));
+       WIDGET_arrow_set_color(manipulator->translate_y, color_green);
+       WM_widget_register(wgroup, manipulator->translate_y);
+
+       manipulator->translate_z = WIDGET_arrow_new(0, SET_INT_IN_POINTER(2));
+       WIDGET_arrow_set_color(manipulator->translate_z, color_blue);
+       WM_widget_register(wgroup, manipulator->translate_z);
+
+       manipulator->rotate_x = WIDGET_dial_new(UI_DIAL_STYLE_RING_CLIPPED, 
NULL);
+       WIDGET_dial_set_color(manipulator->rotate_x, color_red);
+       WM_widget_register(wgroup, manipulator->rotate_x);
+
+       manipulator->rotate_y = WIDGET_dial_new(UI_DIAL_STYLE_RING_CLIPPED, 
SET_INT_IN_POINTER(1));
+       WIDGET_dial_set_color(manipulator->rotate_y, color_green);
+       WM_widget_register(wgroup, manipulator->rotate_y);
+
+       manipulator->rotate_z = WIDGET_dial_new(UI_DIAL_STYLE_RING_CLIPPED, 
SET_INT_IN_POINTER(2));
+       WIDGET_dial_set_color(manipulator->rotate_z, color_blue);
+       WM_widget_register(wgroup, manipulator->rotate_z);
+
+       WM_widgetgroup_customdata_set(wgroup, manipulator);
+}
diff --git a/source/blender/windowmanager/WM_api.h 
b/source/blender/windowmanager/WM_api.h
index c73d1de..be678bf 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -512,9 +512,12 @@ void WM_widgetmaptypes_free(void);
 /* wm_generic_widgets.c */
 
 enum {
-       UI_ARROW_STYLE_NORMAL = 0,
-       UI_ARROW_STYLE_NO_AXIS = 1,
-       UI_ARROW_STYLE_INVERTED = 2,
+       UI_ARROW_STYLE_NORMAL        =  0,
+       UI_ARROW_STYLE_NO_AXIS       = (1 << 1),
+       /* inverted offset during interaction - if set it also sets constrained 
below */
+       UI_ARROW_STYLE_INVERTED      = (1 << 2),
+       /* clamp arrow interaction to property width */
+       UI_ARROW_STYLE_CONSTRAINED   = (1 << 4)
 };
 
 enum {
diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c 
b/source/blender/windowmanager/intern/wm_generic_widgets.c
index e949c8a..958b1db 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -142,12 +142,14 @@ typedef struct ArrowWidget {
        float direction[3];
        float color[4];
        float offset;
+       /* property range and minimum for constrained arrows */
+       float range, min;
 } ArrowWidget;
 
 typedef struct ArrowInteraction {
        float orig_origin[3];
        float orig_mouse[2];
-       float orig_value;
+       float orig_offset;
 
        /* direction vector, projected in screen space */
        float proj_direction[2];
@@ -191,7 +193,7 @@ static void arrow_draw_intern(ArrowWidget *arrow, bool 
select, bool highlight, f
 
                if (arrow->widget.prop) {
                        copy_v3_v3(final_pos, arrow->direction);
-                       mul_v3_fl(final_pos, scale * data->orig_value);
+                       mul_v3_fl(final_pos, scale * data->orig_offset);
                        add_v3_v3(final_pos, arrow->widget.origin);
                }
                else {
@@ -291,12 +293,27 @@ static int widget_arrow_handler(struct bContext *C, const 
struct wmEvent *event,
                float value;
                sub_v3_v3(orig_origin, data->orig_origin);
 
-               value = data->orig_value + facdir * len_v3(orig_origin);
+               value = data->orig_offset + facdir * 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 * 0.5);
+                       else
+                               value = arrow->min + (value * arrow->range * 
0.5);
+               }
+
                RNA_property_float_set(widget->ptr, widget->prop, value);
                RNA_property_update(C, widget->ptr, widget->prop);
 
+
                /* accounts for clamping properly */
-               arrow->offset = RNA_property_float_get(widget->ptr, 
widget->prop);
+               if (arrow->style & UI_ARROW_STYLE_CONSTRAINED) {
+                       if (arrow->style & UI_ARROW_STYLE_INVERTED)
+                               arrow->offset = 2.0 * (arrow->min + 
arrow->range - (RNA_property_float_get(widget

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to