[Bf-blender-cvs] [aa22fa2] wiggly-widgets: Widgets: inverted/constrained to property range working for properties (not operators yet).
Antony Riakiotakis
noreply at git.blender.org
Wed Nov 12 12:00:24 CET 2014
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. @@
More information about the Bf-blender-cvs
mailing list