Commit: 134d69582c5f6370437a6b4570d67251f65e7df1
Author: Antony Riakiotakis
Date:   Wed Nov 19 14:48:02 2014 +0100
Branches: wiggly-widgets
https://developer.blender.org/rB134d69582c5f6370437a6b4570d67251f65e7df1

More refinement to the widget system. Now camera widget should be
indistinguishable than the displayed widget (might probably be worth
deleting the original)

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

M       source/blender/editors/space_node/node_draw.c
M       source/blender/editors/space_view3d/space_view3d.c
M       source/blender/editors/space_view3d/view3d_draw.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/space_node/node_draw.c 
b/source/blender/editors/space_node/node_draw.c
index a2103f5..e85a3a4 100644
--- a/source/blender/editors/space_node/node_draw.c
+++ b/source/blender/editors/space_node/node_draw.c
@@ -1349,7 +1349,7 @@ void drawnodespace(const bContext *C, ARegion *ar)
                        /* almost #wmOrtho2_region_pixelspace, but no +1 px */
                        //wmOrtho2_pixelspace(ar->winx, ar->winy);
 
-                       WM_widgets_draw(C, ar, false);
+                       WM_widgets_draw(C, ar);
 
                        glMatrixMode(GL_PROJECTION);
                        glPopMatrix();
diff --git a/source/blender/editors/space_view3d/space_view3d.c 
b/source/blender/editors/space_view3d/space_view3d.c
index 78056f4..1be83b5 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -721,7 +721,7 @@ static void WIDGETGROUP_camera_update(struct wmWidgetGroup 
*wgroup, const struct
        negate_v3_v3(dir, ob->obmat[2]);
        WIDGET_arrow_set_direction(widget, dir);
        WIDGET_arrow_set_up_vector(widget, ob->obmat[1]);
-       WIDGET_arrow_set_scale(widget, ca->drawsize);
+       WM_widget_set_scale(widget, ca->drawsize);
 }
 
 
@@ -740,6 +740,7 @@ static void WIDGETGROUP_camera_create(struct wmWidgetGroup 
*wgroup)
 
        widget = WIDGET_arrow_new(UI_ARROW_STYLE_CROSS, NULL);
        WM_widget_set_draw_on_hover_only(widget, true);
+       WM_widget_set_3d_scale(widget, false);
        WM_widget_register(wgroup, widget);
        WIDGET_arrow_set_color(widget, color_camera);
 
diff --git a/source/blender/editors/space_view3d/view3d_draw.c 
b/source/blender/editors/space_view3d/view3d_draw.c
index 6fc0d90..99ab628 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -3552,7 +3552,7 @@ void view3d_main_area_draw(const bContext *C, ARegion *ar)
        
        view3d_main_area_setup_view(scene, v3d, ar, NULL, NULL);        
        glClear(GL_DEPTH_BUFFER_BIT);
-       WM_widgets_draw(C, ar, true);
+       WM_widgets_draw(C, ar);
        ED_region_pixelspace(ar);
        
        view3d_main_area_draw_info(C, scene, ar, v3d, grid_unit, render_border);
diff --git a/source/blender/windowmanager/WM_api.h 
b/source/blender/windowmanager/WM_api.h
index 7425949..35349a8 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -484,7 +484,7 @@ void WM_widget_operator(struct wmWidget *,
                         int  (*initialize_op)(struct bContext *, const struct 
wmEvent *, struct wmWidget *, struct PointerRNA *),
                         const char *opname,
                         const char *propname);
-void WM_widgets_draw(const struct bContext *C, struct ARegion *ar, bool is_3d);
+void WM_widgets_draw(const struct bContext *C, struct ARegion *ar);
 void WM_event_add_widget_handler(struct ARegion *ar);
 
 bool WM_widget_register(struct wmWidgetGroup *wgroup, struct wmWidget *widget);
@@ -493,8 +493,9 @@ void WM_widget_unregister(struct wmWidgetGroup *wgroup, 
struct wmWidget *widget)
 void *WM_widget_customdata(struct wmWidget *widget);
 void WM_widget_set_origin(struct wmWidget *widget, float origin[3]);
 void WM_widget_set_draw(struct wmWidget *widget, bool draw);
-
+void WM_widget_set_3d_scale(struct wmWidget *widget, bool scale);
 void WM_widget_set_draw_on_hover_only(struct wmWidget *widget, bool draw);
+void WM_widget_set_scale(struct wmWidget *widget, float scale);
 
 void *WM_widgetgroup_customdata(struct wmWidgetGroup *wgroup);
 void WM_widgetgroup_customdata_set(struct wmWidgetGroup *wgroup, void *data);
diff --git a/source/blender/windowmanager/intern/wm_generic_widgets.c 
b/source/blender/windowmanager/intern/wm_generic_widgets.c
index 814beca..1c7ece1 100644
--- a/source/blender/windowmanager/intern/wm_generic_widgets.c
+++ b/source/blender/windowmanager/intern/wm_generic_widgets.c
@@ -144,7 +144,6 @@ typedef struct ArrowWidget {
        int flag;
        float direction[3];
        float up[3];
-       float scale;
        float color[4];
        float offset;
        /* property range and minimum for constrained arrows */
@@ -208,7 +207,7 @@ static void arrow_draw_intern(ArrowWidget *arrow, bool 
select, bool highlight)
        }
        copy_m4_m3(mat, rot);
        copy_v3_v3(mat[3], final_pos);
-       mul_mat3_m4_fl(mat, arrow->widget.scale * arrow->scale);
+       mul_mat3_m4_fl(mat, arrow->widget.scale);
 
        glPushMatrix();
        glMultMatrixf(&mat[0][0]);
@@ -227,7 +226,7 @@ static void arrow_draw_intern(ArrowWidget *arrow, bool 
select, bool highlight)
 
                copy_m4_m3(mat, rot);
                copy_v3_v3(mat[3], data->orig_origin);
-               mul_mat3_m4_fl(mat, data->orig_scale * arrow->scale);
+               mul_mat3_m4_fl(mat, data->orig_scale);
 
                glPushMatrix();
                glMultMatrixf(&mat[0][0]);
@@ -438,8 +437,9 @@ wmWidget *WIDGET_arrow_new(int style, void *customdata)
        arrow->widget.render_3d_intersection = widget_arrow_render_3d_intersect;
        arrow->widget.customdata = customdata;
        arrow->widget.bind_to_prop = widget_arrow_bind_to_prop;
+       arrow->widget.user_scale = 1.0f;
+       arrow->widget.flag |= WM_WIDGET_SCALE_3D;
        arrow->style = style;
-       arrow->scale = 1.0f;
        copy_v3_v3(arrow->direction, dir_default);
        
        return (wmWidget *)arrow;
@@ -474,13 +474,6 @@ void WIDGET_arrow_set_up_vector(struct wmWidget *widget, 
float direction[3])
        }
 }
 
-void WIDGET_arrow_set_scale(struct wmWidget *widget, float scale)
-{
-       ArrowWidget *arrow = (ArrowWidget *)widget;
-
-       arrow->scale = scale;
-}
-
 
 /********* Dial widget ************/
 
diff --git a/source/blender/windowmanager/intern/wm_widgets.c 
b/source/blender/windowmanager/intern/wm_widgets.c
index f6af313..b0fb8c5 100644
--- a/source/blender/windowmanager/intern/wm_widgets.c
+++ b/source/blender/windowmanager/intern/wm_widgets.c
@@ -222,23 +222,34 @@ static void wm_widgets_delete(ListBase *widgetlist, 
wmWidget *widget)
 }
 
 
-void WM_widgets_draw(const struct bContext *C, struct ARegion *ar, bool is_3d)
+static void widget_calculate_scale(wmWidget *widget, const bContext *C)
+{
+       float scale = 1.0f;
+       RegionView3D *rv3d = CTX_wm_region_view3d(C);
+       if (rv3d && !(U.tw_flag & V3D_3D_WIDGETS) && (widget->flag & 
WM_WIDGET_SCALE_3D)) {
+               if (widget->get_final_position) {
+                       float position[3];
+
+                       widget->get_final_position(widget, position);
+                       scale = ED_view3d_pixel_size(rv3d, position) * 
U.tw_size;
+               }
+               else {
+                       scale = ED_view3d_pixel_size(rv3d, widget->origin) * 
U.tw_size;
+               }
+       }
+
+       widget->scale = scale * widget->user_scale;
+}
+
+void WM_widgets_draw(const bContext *C, struct ARegion *ar)
 {
-       RegionView3D *rv3d;
        wmWidgetMap *wmap = ar->widgetmap;
        wmWidget *widget;
        bool use_lighting;
-       bool do_scale = false;
 
        if (!wmap)
                return;
 
-       if (is_3d) {
-               if (!(U.tw_flag & V3D_3D_WIDGETS))
-                       do_scale = true;
-               rv3d = ar->regiondata;
-       }
-
        use_lighting = (U.tw_flag & V3D_SHADED_WIDGETS) != 0;
 
        if (use_lighting) {
@@ -260,21 +271,9 @@ void WM_widgets_draw(const struct bContext *C, struct 
ARegion *ar, bool is_3d)
        widget = wmap->active_widget;
 
        if (widget) {
-               float scale = 1.0;
-
-               if (do_scale) {
-                       if (widget->get_final_position) {
-                               float position[3];
-                               widget->get_final_position(widget, position);
-                               scale = ED_view3d_pixel_size(rv3d, position) * 
U.tw_size;
-                       }
-                       else {
-                               scale = ED_view3d_pixel_size(rv3d, 
widget->origin) * U.tw_size;
-                       }
-               }
+               widget_calculate_scale(widget, C);
                /* notice that we don't update the widgetgroup, widget is now 
on its own, it should have all
                 * relevant data to update itself */
-               widget->scale = scale;
                widget->draw(widget, C);
        }
        else if (wmap->widgetgroups.first) {
@@ -294,20 +293,7 @@ void WM_widgets_draw(const struct bContext *C, struct 
ARegion *ar, bool is_3d)
                                        if (!(widget_iter->flag & 
WM_WIDGET_SKIP_DRAW) &&
                                            (!(widget_iter->flag & 
WM_WIDGET_DRAW_HOVER) || (widget_iter->flag & WM_WIDGET_HIGHLIGHT)))
                                        {
-                                               float scale = 1.0;
-
-                                               if (do_scale) {
-                                                       if 
(widget_iter->get_final_position) {
-                                                               float 
position[3];
-                                                               
widget_iter->get_final_position(widget_iter, position);
-                                                               scale = 
ED_view3d_pixel_size(rv3d, position) * U.tw_size;
-                                                       }
-                                                       else {
-                                                               scale = 
ED_view3d_pixel_size(rv3d, widget_iter->origin) * U.tw_size;
-                                                       }
-                                               }
-
-                                               widget_iter->scale = scale;
+                                               
widget_calculate_scale(widget_iter, C);
                                                widget_iter->draw(widget_iter, 
C);
                                        }
                                }
@@ -393,6 +379,17 @@ void WM_widget_set_draw(struct wmWidget *widget, bool draw)
        }
 }
 
+void WM_widget_set_3d_scale(struct wmWidget *widget, bool scale)
+{
+       if (scale) {
+               widget->flag |= WM_WIDGET_SCALE_3D;
+       }
+       else {
+               widget->flag &= ~WM_WIDGET_SCALE_3D;
+       }
+}
+
+
 void WM_widget_set_draw_on_hover_only(struct wmWidget *widget, bool draw)
 {
        if (draw) {
@@ -403,6 +400,11 @@ void WM_widget_set_draw_on_hover_only(struct wmWidget 
*widget, bool draw)
        }
 }
 
+void WM_widget_set_scale(struct wmWidget *widget, float scale)
+{
+       widget->user_scale = scale;
+}
+
 
 wmWidgetMapType *WM_widgetmaptype_find(const char *idname, int spaceid, int 
regionid, bool is_3d)
 {
@@ -445,26 +447,9 @@ static void widget_find_active_3D_loop(bContext *C, 
ListBase *visible_widgets)
        int selectionbase = 0;
        LinkData *link;
        wmWidget *widget;
-       RegionView3D *rv3d = CTX_wm_region(C)->regiondata;
 
        for (link = visible_widgets->first; link; link = link->next) {
-               float scale = 1.0;
-
                widget = link->data;
-
-               if (!(U.tw_flag & V3D_3D_WIDGETS)) {
-                       if (widget->get_final_position) {
-                               float position[3];
-                               widget->get_final_position(widget, position);
-                               scale = ED_view3d_pixel_size(rv3d, position) * 
U.tw_size;
-                       }
-                       else {
-                               scale = ED_view3d_pixel_size(rv3d, 
widget->origin) * U.tw_size;
-                       }
-               }
-               /* reset the scale here. We might have more than one 3d view so 
scale is not guaranteed to
-                * have stayed the same */
-               widget->scale = scale;
                widget->render_3d_intersection(C, widget, selectionbase);
 
                selectionbase++;
diff --git a/source/blender/windowmanager/wm.h 
b/source/blender/windowmanager/wm.h
index 07ae91d..ac6ff16 100644
--- a/source/blender/windowmanager/wm.h
+++ b/source/blender/windowmanager/wm.h
@@ -87,6 +87,9 @@ typedef struct wmWidget {
        /* runtime property, set the scale while drawing on the viewport */
        float scale;
 
+       /* user defined scale, in addition to the original one */
+       float user_scale;
+
        /* data used dur

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