[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