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;
 }

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

Reply via email to