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. @@

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

Reply via email to