[Bf-blender-cvs] [c3bfe6d] wiggly-widgets: Allow custom arrow range per widget
Julian Eisel
noreply at git.blender.org
Tue Sep 8 01:28:39 CEST 2015
Commit: c3bfe6d786601fc3e6b1b567b309e72827cb2eb5
Author: Julian Eisel
Date: Tue Sep 8 01:25:00 2015 +0200
Branches: wiggly-widgets
https://developer.blender.org/rBc3bfe6d786601fc3e6b1b567b309e72827cb2eb5
Allow custom arrow range per widget
===================================================================
M source/blender/editors/object/object_lamp.c
M source/blender/editors/space_view3d/space_view3d.c
M source/blender/windowmanager/WM_api.h
M source/blender/windowmanager/intern/wm_generic_widgets.c
===================================================================
diff --git a/source/blender/editors/object/object_lamp.c b/source/blender/editors/object/object_lamp.c
index 92276269..2dd97c1 100644
--- a/source/blender/editors/object/object_lamp.c
+++ b/source/blender/editors/object/object_lamp.c
@@ -231,6 +231,7 @@ void WIDGETGROUP_lamp_create(const struct bContext *C, struct wmWidgetGroup *wgr
RNA_pointer_create(&la->id, &RNA_Lamp, la, &ptr);
WM_widget_set_origin(widget, ob->obmat[3]);
+ WIDGET_arrow_set_range_fac(widget, 4.0f);
WM_widget_property(widget, ARROW_SLOT_OFFSET_WORLD_SPACE, &ptr, propname);
negate_v3_v3(dir, ob->obmat[2]);
WIDGET_arrow_set_direction(widget, dir);
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index 2da168e..5c91d08 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -791,6 +791,7 @@ static void WIDGETGROUP_forcefield_create(const struct bContext *C, struct wmWid
RNA_pointer_create(&ob->id, &RNA_FieldSettings, pd, &ptr);
WIDGET_arrow_set_direction(widget, ob->obmat[2]);
WIDGET_arrow_set_ui_range(widget, -200.0f, 200.0f);
+ WIDGET_arrow_set_range_fac(widget, 6.0f);
WM_widget_set_colors(widget, col, col_hi);
WM_widget_set_origin(widget, ob->obmat[3]);
WM_widget_set_offset(widget, ofs);
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 7448d0d..cafc9ec 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -580,6 +580,7 @@ void WIDGET_arrow_set_direction(struct wmWidget *widget, const float direction[3
void WIDGET_arrow_set_up_vector(struct wmWidget *widget, const float direction[3]);
void WIDGET_arrow_set_line_vec(struct wmWidget *widget, const float (*vec)[3], const int tot_points);
void WIDGET_arrow_set_ui_range(struct wmWidget *widget, const float min, const float max);
+void WIDGET_arrow_set_range_fac(struct wmWidget *widget, const float range_fac);
struct wmWidget *WIDGET_dial_new(struct wmWidgetGroup *wgroup, const char *name, const int style);
void WIDGET_dial_set_direction(struct wmWidget *widget, const float direction[3]);
diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c b/source/blender/windowmanager/intern/wm_generic_widgets.c
index c57ef0f..16021ef 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -166,8 +166,11 @@ typedef struct ArrowWidget {
int flag;
float direction[3];
float up[3];
+
float (*line)[3]; /* custom coords for arrow line drawing */
int tot_line_points; /* amount of points for arrow line drawing */
+
+ float range_fac; /* factor for arrow min/max distance */
float offset;
/* property range and minimum for constrained arrows */
float range, min;
@@ -360,8 +363,6 @@ static void widget_arrow_draw(const bContext *UNUSED(C), wmWidget *widget)
arrow_draw_intern((ArrowWidget *)widget, false, (widget->flag & WM_WIDGET_HIGHLIGHT) != 0);
}
-#define ARROW_RANGE 6.0f
-
static int widget_arrow_handler(bContext *C, const wmEvent *event, wmWidget *widget)
{
ArrowWidget *arrow = (ArrowWidget *)widget;
@@ -457,9 +458,9 @@ static int widget_arrow_handler(bContext *C, const wmEvent *event, wmWidget *wid
value = data->orig_offset + facdir * len_v3(offset);
if (arrow->style & WIDGET_ARROW_STYLE_CONSTRAINED) {
if (arrow->style & WIDGET_ARROW_STYLE_INVERTED)
- value = max - (value * arrow->range / ARROW_RANGE);
+ value = max - (value * arrow->range / arrow->range_fac);
else
- value = arrow->min + (value * arrow->range / ARROW_RANGE);
+ value = arrow->min + (value * arrow->range / arrow->range_fac);
}
/* clamp to custom range */
@@ -475,9 +476,9 @@ static int widget_arrow_handler(bContext *C, const wmEvent *event, wmWidget *wid
/* accounts for clamping properly */
if (arrow->style & WIDGET_ARROW_STYLE_CONSTRAINED) {
if (arrow->style & WIDGET_ARROW_STYLE_INVERTED)
- arrow->offset = ARROW_RANGE * (max - value) / arrow->range;
+ arrow->offset = arrow->range_fac * (max - value) / arrow->range;
else
- arrow->offset = ARROW_RANGE * ((value - arrow->min) / arrow->range);
+ arrow->offset = arrow->range_fac * ((value - arrow->min) / arrow->range);
}
else
arrow->offset = value;
@@ -540,10 +541,10 @@ static void widget_arrow_bind_to_prop(wmWidget *widget, const int UNUSED(slot))
}
if (arrow->style & WIDGET_ARROW_STYLE_INVERTED) {
- arrow->offset = ARROW_RANGE * (max - float_prop) / arrow->range;
+ arrow->offset = arrow->range_fac * (max - float_prop) / arrow->range;
}
else {
- arrow->offset = ARROW_RANGE * ((float_prop - arrow->min) / arrow->range);
+ arrow->offset = arrow->range_fac * ((float_prop - arrow->min) / arrow->range);
}
}
else {
@@ -612,6 +613,7 @@ wmWidget *WIDGET_arrow_new(wmWidgetGroup *wgroup, const char *name, const int st
arrow->widget.flag |= WM_WIDGET_SCALE_3D;
arrow->style = real_style;
+ arrow->range_fac = 1.0f;
/* defaults */
copy_v3_v3(arrow->direction, dir_default);
@@ -679,6 +681,18 @@ void WIDGET_arrow_set_ui_range(wmWidget *widget, const float min, const float ma
arrow->flag |= ARROW_CUSTOM_RANGE_SET;
}
+/**
+ * Define a custom factor for arrow min/max distance
+ *
+ * \note Needs to be called before WM_widget_property!
+ */
+void WIDGET_arrow_set_range_fac(wmWidget *widget, const float range_fac)
+{
+ ArrowWidget *arrow = (ArrowWidget *)widget;
+
+ arrow->range_fac = range_fac;
+}
+
/********* Dial widget ************/
More information about the Bf-blender-cvs
mailing list