[Bf-blender-cvs] [2a18501] wiggly-widgets: Add mapping to properties for widgets.

Antony Riakiotakis noreply at git.blender.org
Wed Nov 5 19:41:38 CET 2014


Commit: 2a18501562411ae06a9bba8c012a77c264feb846
Author: Antony Riakiotakis
Date:   Wed Nov 5 19:40:11 2014 +0100
Branches: wiggly-widgets
https://developer.blender.org/rB2a18501562411ae06a9bba8c012a77c264feb846

Add mapping to properties for widgets.

Still pretty much exploring the best way to move here but currently this
works by wrapping objects in RNA pointers, pretty much like buttons do.

Also modified the arrow widget for lamps to use the new code. The new
"unmbrella" widget works now as expected for lamps - of course fine
tuning is also needed.

===================================================================

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/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_generic_widgets.c
M	source/blender/windowmanager/intern/wm_widgets.c
M	source/blender/windowmanager/wm.h

===================================================================

diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h
index 3eeb070..92c163a 100644
--- a/source/blender/editors/include/ED_view3d.h
+++ b/source/blender/editors/include/ED_view3d.h
@@ -370,8 +370,13 @@ void ED_view3d_operator_properties_viewmat_set(struct bContext *C, struct wmOper
 void ED_view3d_operator_properties_viewmat_get(struct wmOperator *op, int *winx, int *winy, float persmat[4][4]);
 #endif
 
+typedef struct WidgetGroupLamp {
+	struct PointerRNA *lamp;
+} 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);
 
 /* 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 2f6ff57..a17299b 100644
--- a/source/blender/editors/object/object_lamp.c
+++ b/source/blender/editors/object/object_lamp.c
@@ -218,9 +218,21 @@ void WIDGETGROUP_lamp_update(struct wmWidgetGroup *wgroup, const struct bContext
 {
 	Object *ob = CTX_data_active_object(C);
 	wmWidget *lamp = WM_widgetgroup_widgets(wgroup)->first;
+	WidgetGroupLamp *data = WM_widgetgroup_customdata(wgroup);
 	float dir[3];
 
+	RNA_pointer_create(&ob->id, &RNA_Lamp, ob->data, data->lamp);
 	WM_widget_set_origin(lamp, ob->obmat[3]);
+	WM_widget_bind_to_prop(lamp, data->lamp, "spot_size");
 	negate_v3_v3(dir, ob->obmat[2]);
 	WIDGET_arrow_set_direction(lamp, dir);
 }
+
+
+void WIDGETGROUP_lamp_free(struct wmWidgetGroup *wgroup)
+{
+	WidgetGroupLamp *data = WM_widgetgroup_customdata(wgroup);
+	MEM_freeN(data->lamp);
+	MEM_freeN(data);
+}
+
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index a92f4ad..c15b406 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -700,17 +700,20 @@ static void view3d_widgets(void)
 
 	wmWidget *widget = NULL;
 	ManipulatorGroup *manipulator = MEM_callocN(sizeof(ManipulatorGroup), "manipulator_data");
+	WidgetGroupLamp *lampgroup = MEM_callocN(sizeof(ManipulatorGroup), "lamp_manipulator_data");
 	struct wmWidgetMap *wmap = WM_widgetmap_find("View3D", SPACE_VIEW3D, RGN_TYPE_WINDOW, true);
 	struct wmWidgetGroup *wgroup_manipulator = WM_widgetgroup_new(WIDGETGROUP_manipulator_poll, 
 	                                                              WIDGETGROUP_manipulator_update,
 	                                                              WIDGETGROUP_manipulator_free, manipulator);
-	struct wmWidgetGroup *wgroup_light = WM_widgetgroup_new(WIDGETGROUP_lamp_poll, WIDGETGROUP_lamp_update, NULL, NULL);
-	
+	struct wmWidgetGroup *wgroup_light = WM_widgetgroup_new(WIDGETGROUP_lamp_poll, WIDGETGROUP_lamp_update, WIDGETGROUP_lamp_free, lampgroup);
+
+	lampgroup->lamp = MEM_callocN(sizeof(PointerRNA), "lampwidgetptr");
+
 	widget = WM_widget_new(WIDGET_manipulator_draw, 
 	                       WIDGET_manipulator_render_3d_intersect,
 	                       NULL,
 	                       WIDGET_manipulator_handler,
-	                       NULL, NULL, false, NULL, NULL, NULL);
+	                       NULL, NULL, false, NULL, NULL);
 	
 	WM_widget_register(wgroup_manipulator, widget);
 
@@ -738,7 +741,7 @@ static void view3d_widgets(void)
 	WIDGET_dial_set_color(manipulator->rotate_z, color_blue);
 	WM_widget_register(wgroup_manipulator, manipulator->rotate_z);
 
-	widget = WIDGET_arrow_new(0, NULL, "UI_OT_lamp_position", "value", NULL);
+	widget = WIDGET_arrow_new(0, NULL, NULL, NULL, NULL);
 	WM_widget_register(wgroup_light,  widget);
 	WIDGET_arrow_set_color(widget, color_lamp);
 
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index eca4875..4794292 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -472,12 +472,13 @@ struct wmWidgetGroup *WM_widgetgroup_new(bool (*poll)(struct wmWidgetGroup *, co
                                          void *customdata);
 
 struct wmWidget *WM_widget_new(void (*draw)(struct wmWidget *, const struct bContext *, float scale),
-							   void (*render_3d_intersection)(const struct bContext *, struct wmWidget *, float, int),
-							   int  (*intersect)(struct bContext *C, const struct wmEvent *event, struct wmWidget *customdata),
+                               void (*render_3d_intersection)(const struct bContext *, struct wmWidget *, float, int),
+                               int  (*intersect)(struct bContext *C, const struct wmEvent *event, struct wmWidget *customdata),
                                int  (*initialize_op)(struct bContext *, const struct wmEvent *, struct wmWidget *, struct PointerRNA *),
                                int  (*handler)(struct bContext *, const struct wmEvent *, struct wmWidget *, struct wmOperator *op),
-                               void *customdata, bool free_data, char *opname, char *prop, struct PointerRNA *ptr);
+                               void *customdata, bool free_data, char *opname, char *prop);
 
+void WM_widget_bind_to_prop(struct wmWidget *, struct PointerRNA *ptr, const char *propname);
 void WM_widgets_draw(const struct bContext *C, struct ARegion *ar);
 void WM_event_add_widget_handler(struct ARegion *ar);
 
diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c b/source/blender/windowmanager/intern/wm_generic_widgets.c
index 9175fe7..760f30c 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -146,6 +146,7 @@ typedef struct ArrowWidget {
 typedef struct ArrowInteraction {
 	float orig_origin[3];
 	float orig_mouse[2];
+	float orig_value;
 
 	/* direction vector, projected in screen space */
 	float proj_direction[2];
@@ -156,10 +157,20 @@ static void arrow_draw_intern(ArrowWidget *arrow, bool select, bool highlight, f
 	float rot[3][3];
 	float mat[4][4];
 	float up[3] = {0.0f, 0.0f, 1.0f};
+	float final_pos[3];
+
+	if (arrow->widget.prop) {
+		copy_v3_v3(final_pos, arrow->direction);
+		mul_v3_fl(final_pos, RNA_property_float_get(arrow->widget.ptr, arrow->widget.prop));
+		add_v3_v3(final_pos, arrow->widget.origin);
+	}
+	else {
+		copy_v3_v3(final_pos, arrow->widget.origin);
+	}
 
 	rotation_between_vecs_to_mat3(rot, up, arrow->direction);
 	copy_m4_m3(mat, rot);
-	copy_v3_v3(mat[3], arrow->widget.origin);
+	copy_v3_v3(mat[3], final_pos);
 	mul_mat3_m4_fl(mat, scale);
 
 	glPushMatrix();
@@ -216,6 +227,7 @@ static int widget_arrow_handler(struct bContext *C, const struct wmEvent *event,
 	float m_diff[2];
 	float dir_2d[2], dir2d_final[2];
 	float fac;
+	float facdir = 1.0f;
 
 	copy_v3_v3(orig_origin, data->orig_origin);
 	orig_origin[3] = 1.0f;
@@ -256,13 +268,23 @@ static int widget_arrow_handler(struct bContext *C, const struct wmEvent *event,
 	project_v3_v3v3(offset, arrow->direction, orig_origin);
 	fac = len_v3(orig_origin) / len_v3(offset);
 	if (dot_v3v3(offset, orig_origin) < 0.0f)
-		fac *= -1.0;
-	mul_v3_v3fl(widget->origin, offset, fac);
-	add_v3_v3(widget->origin, data->orig_origin);
+		facdir = -1.0;
+	fac *= facdir;
+	mul_v3_v3fl(orig_origin, offset, fac);
+	add_v3_v3(orig_origin, data->orig_origin);
 
 	/* set the property for the operator and call its modal function */
-	if (op && widget->prop) {
-		RNA_float_set_array(op->ptr, widget->prop, widget->origin);
+	if (op && widget->propname) {
+		copy_v3_v3(widget->origin, orig_origin);
+		RNA_float_set_array(op->ptr, widget->propname, widget->origin);
+	}
+	else if (widget->prop) {
+		float value;
+		sub_v3_v3(orig_origin, data->orig_origin);
+
+		value = data->orig_value + facdir * len_v3(orig_origin);
+		RNA_property_float_set(widget->ptr, widget->prop, value);
+		RNA_property_update(C, widget->ptr, widget->prop);
 	}
 
 	/* tag the region for redraw */
@@ -275,11 +297,25 @@ static int widget_arrow_handler(struct bContext *C, const struct wmEvent *event,
 static int widget_arrow_activate(struct bContext *UNUSED(C), const struct wmEvent *event, struct wmWidget *widget, int state)
 {
 	if (state == WIDGET_ACTIVATE) {
+		ArrowWidget *arrow = (ArrowWidget *)widget;
 		ArrowInteraction *data = MEM_callocN(sizeof (ArrowInteraction), "arrow_interaction");
+		float final_pos[3];
+
+		if (widget->prop) {
+			float val = RNA_property_float_get(widget->ptr, widget->prop);
+			copy_v3_v3(final_pos, arrow->direction);
+			mul_v3_fl(final_pos, RNA_property_float_get(widget->ptr, widget->prop));
+			add_v3_v3(final_pos, widget->origin);
+			data->orig_value = val;
+		}
+		else {
+			copy_v3_v3(final_pos, widget->origin);
+		}
+
 		data->orig_mouse[0] = event->mval[0];
 		data->orig_mouse[1] = event->mval[1];
 
-		copy_v3_v3(data->orig_origin, widget->origin);
+		copy_v3_v3(data->orig_origin, final_pos);
 
 		widget->interaction_data = data;
 	}
@@ -316,7 +352,7 @@ wmWidget *WIDGET_arrow_new(int style,
 	arrow->widget.activate_state = widget_arrow_activate;
 	arrow->widget.render_3d_intersection = widget_arrow_render_3d_intersect;
 	arrow->widget.opname = opname;
-	arrow->widget.prop = prop;
+	arrow->widget.propname = prop;
 	arrow->widget.customdata = customdata;
 
 	arrow->style = style;
@@ -442,7 +478,7 @@ wmWidget *WIDGET_dial_new(int style,
 	dial->widget.intersect = NULL;
 	dial->widget.render_3d_intersection = widget_dial_render_3d_intersect;
 	dial->widget.opname = opname;
-	dial->widget.prop = prop;
+	dial->widget.propname = prop;
 	dial->widget.customdata = customdata;
 
 	dial->style = style;
diff --git a/source/blender/windowmanager/intern/wm_widgets.c b/source/blender/windowmanager/intern/wm_widgets.c
index 331d961..28ee6e2 100644
--- a/source/blender/windowmanager/intern/wm_widgets.c
+++ b/source/blender/windowmanager/intern/wm_widgets.c
@@ -67,9 +67,7 @@
 #include "GL/glew.h"
 #include "GPU_select.h"
 
-#ifndef NDEBUG
-#  include "RNA_enum_types.h"
-#endif
+#include "RNA_access.h"
 
 typedef struct wmWidgetMap {
 	struct wmWidgetMap *next, *prev;
@@ -140,7 +138,7 @@ wmWidge

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list