[Bf-blender-cvs] [47da6a9] wiggly-widgets: Add initial widget for wind force field strength
Julian Eisel
noreply at git.blender.org
Sat Aug 29 00:06:06 CEST 2015
Commit: 47da6a91c3e1a615c6608fef7879a27704f00946
Author: Julian Eisel
Date: Sat Aug 29 00:04:43 2015 +0200
Branches: wiggly-widgets
https://developer.blender.org/rB47da6a91c3e1a615c6608fef7879a27704f00946
Add initial widget for wind force field strength
Requested by @gottfried
===================================================================
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/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index 22090e6..39df6e1 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -36,6 +36,7 @@
#include "DNA_material_types.h"
#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
+#include "DNA_object_force.h"
#include "DNA_scene_types.h"
#include "DNA_camera_types.h"
#include "DNA_key_types.h"
@@ -764,6 +765,37 @@ static void WIDGETGROUP_camera_create(const struct bContext *C, struct wmWidgetG
WM_widget_set_scale(widget, ca->drawsize);
}
+static int WIDGETGROUP_forcefield_poll(const struct bContext *C, struct wmWidgetGroupType *UNUSED(wgrouptype))
+{
+ Object *ob = CTX_data_active_object(C);
+
+ return ob && ob->pd && ob->pd->forcefield;
+}
+
+static void WIDGETGROUP_forcefield_create(const struct bContext *C, struct wmWidgetGroup *wgroup)
+{
+ Object *ob = CTX_data_active_object(C);
+ PartDeflect *pd = ob->pd;
+ PointerRNA ptr;
+ wmWidget *widget;
+
+ const float col[4] = {0.8f, 0.8f, 0.45f, 0.5f};
+ const float col_hi[4] = {0.8f, 0.8f, 0.45f, 1.0f};
+
+ /* only wind effector for now */
+ if (pd->forcefield == PFIELD_WIND) {
+ widget = WIDGET_arrow_new(wgroup, "field_strength", WIDGET_ARROW_STYLE_CONSTRAINED);
+
+ RNA_pointer_create(&ob->id, &RNA_FieldSettings, pd, &ptr);
+ WIDGET_arrow_set_direction(widget, ob->obmat[2]);
+ WIDGET_arrow_set_ui_range(widget, -150.0f, 150.0f);
+ WM_widget_set_colors(widget, col, col_hi);
+ WM_widget_set_origin(widget, ob->obmat[3]);
+ WM_widget_set_3d_scale(widget, false);
+ WM_widget_property(widget, ARROW_SLOT_OFFSET_WORLD_SPACE, &ptr, "strength");
+ }
+}
+
#if 0
static int WIDGETGROUP_shapekey_poll(const struct bContext *C, struct wmWidgetGroupType *UNUSED(wgrouptype))
{
@@ -878,6 +910,7 @@ static void view3d_widgets(void)
WM_widgetgrouptype_new(WIDGETGROUP_manipulator_poll, WIDGETGROUP_manipulator_create, NULL, "View3D", SPACE_VIEW3D, RGN_TYPE_WINDOW, true);
WM_widgetgrouptype_new(WIDGETGROUP_lamp_poll, WIDGETGROUP_lamp_create, NULL, "View3D", SPACE_VIEW3D, RGN_TYPE_WINDOW, true);
WM_widgetgrouptype_new(WIDGETGROUP_camera_poll, WIDGETGROUP_camera_create, NULL, "View3D", SPACE_VIEW3D, RGN_TYPE_WINDOW, true);
+ WM_widgetgrouptype_new(WIDGETGROUP_forcefield_poll, WIDGETGROUP_forcefield_create, NULL, "View3D", SPACE_VIEW3D, RGN_TYPE_WINDOW, true);
WM_widgetgrouptype_new(WIDGETGROUP_armature_facemap_poll, WIDGETGROUP_armature_facemap_create, NULL, "View3D", SPACE_VIEW3D, RGN_TYPE_WINDOW, true);
}
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 2164d45..6c7111a 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -578,7 +578,7 @@ struct wmWidget *WIDGET_arrow_new(struct wmWidgetGroup *wgroup, const char *name
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_scale(struct wmWidget *widget, const float scale);
+void WIDGET_arrow_set_ui_range(struct wmWidget *widget, const float min, const float max);
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 405738f..092ec7e 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -153,7 +153,12 @@ static void widget_draw_intern(WidgetDrawInfo *info, const bool select)
/********* Arrow widget ************/
-#define ARROW_UP_VECTOR_SET 1
+/* ArrowWidget->flag */
+enum {
+ ARROW_UP_VECTOR_SET = (1 << 0),
+ ARROW_CUSTOM_LINE_SET = (1 << 1),
+ ARROW_CUSTOM_RANGE_SET = (1 << 2),
+};
typedef struct ArrowWidget {
wmWidget widget;
@@ -227,7 +232,7 @@ static void arrow_draw_geom(const ArrowWidget *arrow, const bool select)
normalize_v3_v3(co_norm1, arrow->line[last_co_idx - 1]);
normalize_v3_v3(co_norm2, arrow->line[last_co_idx]);
rotation_between_vecs_to_mat3(rot, co_norm1, co_norm2);
- if (arrow->style & WIDGET_ARROW_STYLE_INVERTED) {
+ if ((arrow->flag & ARROW_CUSTOM_LINE_SET) == 0) {
negate_m3(rot);
}
@@ -443,16 +448,22 @@ static int widget_arrow_handler(bContext *C, const wmEvent *event, wmWidget *wid
if (widget->props[ARROW_SLOT_OFFSET_WORLD_SPACE]) {
PointerRNA ptr = widget->ptr[ARROW_SLOT_OFFSET_WORLD_SPACE];
PropertyRNA *prop = widget->props[ARROW_SLOT_OFFSET_WORLD_SPACE];
+ float max = arrow->min + arrow->range;
float value;
value = data->orig_offset + facdir * len_v3(offset);
if (arrow->style & WIDGET_ARROW_STYLE_CONSTRAINED) {
if (arrow->style & WIDGET_ARROW_STYLE_INVERTED)
- value = arrow->min + arrow->range - (value * arrow->range / ARROW_RANGE);
+ value = max - (value * arrow->range / ARROW_RANGE);
else
value = arrow->min + (value * arrow->range / ARROW_RANGE);
}
+ /* clamp to custom range */
+ if (arrow->flag & ARROW_CUSTOM_RANGE_SET) {
+ CLAMP(value, arrow->min, max);
+ }
+
RNA_property_float_set(&ptr, prop, value);
RNA_property_update(C, &ptr, prop);
/* get clamped value */
@@ -461,7 +472,7 @@ 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 * (arrow->min + arrow->range - value) / arrow->range;
+ arrow->offset = ARROW_RANGE * (max - value) / arrow->range;
else
arrow->offset = ARROW_RANGE * ((value - arrow->min) / arrow->range);
}
@@ -505,14 +516,19 @@ static void widget_arrow_bind_to_prop(wmWidget *widget, const int UNUSED(slot))
PropertyRNA *prop = widget->props[ARROW_SLOT_OFFSET_WORLD_SPACE];
if (prop) {
- const float float_prop = RNA_property_float_get(&ptr, prop);
+ float float_prop = RNA_property_float_get(&ptr, prop);
if (arrow->style & WIDGET_ARROW_STYLE_CONSTRAINED) {
float min, max, step, precision;
- RNA_property_float_ui_range(&ptr, prop, &min, &max, &step, &precision);
- arrow->range = max - min;
- arrow->min = min;
+ if (arrow->flag & ARROW_CUSTOM_RANGE_SET) {
+ max = arrow->min + arrow->range;
+ }
+ else {
+ RNA_property_float_ui_range(&ptr, prop, &min, &max, &step, &precision);
+ arrow->range = max - min;
+ arrow->min = min;
+ }
if (arrow->style & WIDGET_ARROW_STYLE_INVERTED) {
arrow->offset = ARROW_RANGE * (max - float_prop) / arrow->range;
@@ -622,6 +638,24 @@ void WIDGET_arrow_set_line_vec(wmWidget *widget, const float (*vec)[3], const in
arrow->tot_line_points = tot_points;
arrow->line = MEM_reallocN(arrow->line, vec_size);
memcpy(arrow->line, vec, vec_size);
+
+ arrow->flag |= ARROW_CUSTOM_LINE_SET;
+}
+
+/**
+ * Define a custom property UI range
+ *
+ * \note Needs to be called before WM_widget_property!
+ */
+void WIDGET_arrow_set_ui_range(wmWidget *widget, const float min, const float max)
+{
+ ArrowWidget *arrow = (ArrowWidget *)widget;
+
+ BLI_assert(min < max);
+
+ arrow->range = max - min;
+ arrow->min = min;
+ arrow->flag |= ARROW_CUSTOM_RANGE_SET;
}
More information about the Bf-blender-cvs
mailing list