[Bf-blender-cvs] [4e4c1a0] wiggly-widgets: Support undo. Scale stays same for non-3D widgets

Antony Riakiotakis noreply at git.blender.org
Fri Nov 7 18:13:07 CET 2014


Commit: 4e4c1a0ea05d31680c5c4ea2dfdc863d3cb06157
Author: Antony Riakiotakis
Date:   Thu Nov 6 12:11:38 2014 +0100
Branches: wiggly-widgets
https://developer.blender.org/rB4e4c1a0ea05d31680c5c4ea2dfdc863d3cb06157

Support undo. Scale stays same for non-3D widgets

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

M	source/blender/blenkernel/intern/blender.c
M	source/blender/editors/include/ED_transform.h
M	source/blender/editors/space_view3d/space_view3d.c
M	source/blender/editors/transform/transform_manipulator.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/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c
index adfe43c..af641460 100644
--- a/source/blender/blenkernel/intern/blender.c
+++ b/source/blender/blenkernel/intern/blender.c
@@ -616,6 +616,9 @@ static int read_undosave(bContext *C, UndoElem *uel)
 	else
 		success = BKE_read_file_from_memfile(C, &uel->memfile, NULL);
 
+	/* when reading from memory all references get invalidated so invalidate all widgets */
+	WM_widgetgroups_invalidate();
+
 	/* restore */
 	BLI_strncpy(G.main->name, mainstr, sizeof(G.main->name)); /* restore */
 	G.fileflags = fileflags;
diff --git a/source/blender/editors/include/ED_transform.h b/source/blender/editors/include/ED_transform.h
index c650f24..c66e04d 100644
--- a/source/blender/editors/include/ED_transform.h
+++ b/source/blender/editors/include/ED_transform.h
@@ -170,8 +170,8 @@ int WIDGET_manipulator_handler(struct bContext *C, const struct wmEvent *event,
 int WIDGET_manipulator_handler_trans(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget, struct PointerRNA *ptr);
 int WIDGET_manipulator_handler_rot(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget, struct PointerRNA *ptr);
 
-void WIDGET_manipulator_render_3d_intersect(const struct bContext *C, struct wmWidget *widget, float scale, int selectionbase);
-void WIDGET_manipulator_draw(struct wmWidget *widget, const struct bContext *C, float scale);
+void WIDGET_manipulator_render_3d_intersect(const struct bContext *C, struct wmWidget *widget, int selectionbase);
+void WIDGET_manipulator_draw(struct wmWidget *widget, const struct bContext *C);
 bool WIDGETGROUP_manipulator_poll(struct wmWidgetGroup *wgroup, const struct bContext *C);
 void WIDGETGROUP_manipulator_update(struct wmWidgetGroup *wgroup, const struct bContext *C);
 void WIDGETGROUP_manipulator_free(struct wmWidgetGroup *wgroup);
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index c15b406..925bbe2 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -741,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, NULL, NULL, NULL);
+	widget = WIDGET_arrow_new(UI_ARROW_STYLE_INVERTED, NULL, NULL, NULL, NULL);
 	WM_widget_register(wgroup_light,  widget);
 	WIDGET_arrow_set_color(widget, color_lamp);
 
diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c
index a2fe94b..68311b8 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -1655,7 +1655,7 @@ static int manipulator_flags_from_active(int active)
 	return val;
 }
 
-void WIDGET_manipulator_draw(wmWidget *UNUSED(widget), const bContext *C, float UNUSED(scale))
+void WIDGET_manipulator_draw(wmWidget *UNUSED(widget), const bContext *C)
 {
 	ScrArea *sa = CTX_wm_area(C);
 	ARegion *ar = CTX_wm_region(C);
@@ -1813,7 +1813,7 @@ bool WIDGETGROUP_manipulator_poll(wmWidgetGroup *UNUSED(wgroup), const struct bC
 	return ((v3d->twflag & V3D_USE_MANIPULATOR) != 0);
 }
 
-void WIDGET_manipulator_render_3d_intersect(const bContext *C, wmWidget *UNUSED(widget), float UNUSED(scale), int selectionbase)
+void WIDGET_manipulator_render_3d_intersect(const bContext *C, wmWidget *UNUSED(widget), int selectionbase)
 {
 	ScrArea *sa = CTX_wm_area(C);
 	View3D *v3d = sa->spacedata.first;
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 4794292..6a8f2d3 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -471,8 +471,8 @@ struct wmWidgetGroup *WM_widgetgroup_new(bool (*poll)(struct wmWidgetGroup *, co
                                          void (*free)(struct wmWidgetGroup *),
                                          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),
+struct wmWidget *WM_widget_new(void (*draw)(struct wmWidget *, const struct bContext *),
+                               void (*render_3d_intersection)(const struct bContext *, struct wmWidget *, 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),
@@ -495,6 +495,8 @@ ListBase *WM_widgetgroup_widgets(struct wmWidgetGroup *wgroup);
 bool WM_widgetgroup_register(struct wmWidgetMap *wmap, struct wmWidgetGroup *wgroup);
 void WM_widgetgroup_unregister(struct wmWidgetMap *wmap, struct wmWidgetGroup *wgroup);
 
+void WM_widgetgroups_invalidate(void);
+
 struct wmWidgetMap *WM_widgetmap_find(const char *idname, int spaceid, int regionid, bool is_3d);
 void WM_widgetmaps_free(void);
 
@@ -503,6 +505,7 @@ void WM_widgetmaps_free(void);
 enum {
 	UI_ARROW_STYLE_NORMAL = 0,
 	UI_ARROW_STYLE_NO_AXIS = 1,
+	UI_ARROW_STYLE_INVERTED = 2,
 };
 
 enum {
diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c b/source/blender/windowmanager/intern/wm_generic_widgets.c
index 760f30c..f7fca23 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -81,7 +81,7 @@ typedef struct WidgetDrawInfo {
 } WidgetDrawInfo;
 
 
-WidgetDrawInfo arraw_draw_info = {0};
+WidgetDrawInfo arraw_head_draw_info = {0};
 WidgetDrawInfo dial_draw_info = {0};
 
 static void widget_draw_intern(WidgetDrawInfo *info, bool select)
@@ -161,7 +161,7 @@ static void arrow_draw_intern(ArrowWidget *arrow, bool select, bool highlight, f
 
 	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));
+		mul_v3_fl(final_pos, scale * RNA_property_float_get(arrow->widget.ptr, arrow->widget.prop));
 		add_v3_v3(final_pos, arrow->widget.origin);
 	}
 	else {
@@ -181,15 +181,23 @@ static void arrow_draw_intern(ArrowWidget *arrow, bool select, bool highlight, f
 	else
 		glColor4fv(arrow->color);
 
-	widget_draw_intern(&arraw_draw_info, select);
+	widget_draw_intern(&arraw_head_draw_info, select);
 
 	glPopMatrix();
 
 	if (arrow->widget.interaction_data) {
 		ArrowInteraction *data = arrow->widget.interaction_data;
 
+		if (arrow->widget.prop) {
+			copy_v3_v3(final_pos, arrow->direction);
+			mul_v3_fl(final_pos, scale * data->orig_value);
+			add_v3_v3(final_pos, arrow->widget.origin);
+		}
+		else {
+			copy_v3_v3(final_pos, arrow->widget.origin);
+		}
 		copy_m4_m3(mat, rot);
-		copy_v3_v3(mat[3], data->orig_origin);
+		copy_v3_v3(mat[3], final_pos);
 		mul_mat3_m4_fl(mat, scale);
 
 		glPushMatrix();
@@ -197,22 +205,22 @@ static void arrow_draw_intern(ArrowWidget *arrow, bool select, bool highlight, f
 
 		glEnable(GL_BLEND);
 		glColor4f(0.5f, 0.5f, 0.5f, 0.5f);
-		widget_draw_intern(&arraw_draw_info, select);
+		widget_draw_intern(&arraw_head_draw_info, select);
 		glDisable(GL_BLEND);
 
 		glPopMatrix();
 	}
 }
 
-static void widget_arrow_render_3d_intersect(const struct bContext *UNUSED(C), struct wmWidget *widget, float scale, int selectionbase)
+static void widget_arrow_render_3d_intersect(const struct bContext *UNUSED(C), struct wmWidget *widget, int selectionbase)
 {
 	GPU_select_load_id(selectionbase);
-	arrow_draw_intern((ArrowWidget *)widget, true, false, scale);
+	arrow_draw_intern((ArrowWidget *)widget, true, false, widget->scale);
 }
 
-static void widget_arrow_draw(struct wmWidget *widget, const struct bContext *UNUSED(C), float scale)
+static void widget_arrow_draw(struct wmWidget *widget, const struct bContext *UNUSED(C))
 {
-	arrow_draw_intern((ArrowWidget *)widget, false, (widget->flag & WM_WIDGET_HIGHLIGHT) != 0, scale);
+	arrow_draw_intern((ArrowWidget *)widget, false, (widget->flag & WM_WIDGET_HIGHLIGHT) != 0, widget->scale);
 }
 
 static int widget_arrow_handler(struct bContext *C, const struct wmEvent *event, struct wmWidget *widget, struct wmOperator *op)
@@ -297,25 +305,16 @@ 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_value = RNA_property_float_get(widget->ptr, widget->prop);
 		}
 
 		data->orig_mouse[0] = event->mval[0];
 		data->orig_mouse[1] = event->mval[1];
 
-		copy_v3_v3(data->orig_origin, final_pos);
+		copy_v3_v3(data->orig_origin, widget->origin);
 
 		widget->interaction_data = data;
 	}
@@ -334,13 +333,13 @@ wmWidget *WIDGET_arrow_new(int style,
 	float dir_default[3] = {0.0f, 0.0f, 1.0f};
 	ArrowWidget *arrow;
 
-	if (!arraw_draw_info.init) {
-		arraw_draw_info.nverts = _WIDGET_nverts_arrow,
-		arraw_draw_info.ntris = _WIDGET_ntris_arrow,
-		arraw_draw_info.verts = _WIDGET_verts_arrow,
-		arraw_draw_info.normals = _WIDGET_normals_arrow,
-		arraw_draw_info.indices = _WIDGET_indices_arrow,
-		arraw_draw_info.init = true;
+	if (!arraw_head_draw_info.init) {
+		arraw_head_draw_info.nverts = _WIDGET_nverts_arrow,
+		arraw_head_draw_info.ntris = _WIDGET_ntris_arrow,
+		ar

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list