[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