Commit: 10678f7572ee0d37d4d22cd630bc1aa8dd688eea
Author: Julian Eisel
Date:   Fri Sep 11 00:52:40 2015 +0200
Branches: wiggly-widgets
https://developer.blender.org/rB10678f7572ee0d37d4d22cd630bc1aa8dd688eea

Fix 3D view widgets not updated correctly

Was barely visible to users (noticed only with view oriented manipulator), 
since I fixed appearing issues individually. Will remove these fixes next.

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

M       source/blender/editors/space_view3d/view3d_draw.c
M       source/blender/windowmanager/intern/wm_widgets.c

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

diff --git a/source/blender/editors/space_view3d/view3d_draw.c 
b/source/blender/editors/space_view3d/view3d_draw.c
index e6a7304..8e89eda 100644
--- a/source/blender/editors/space_view3d/view3d_draw.c
+++ b/source/blender/editors/space_view3d/view3d_draw.c
@@ -3762,6 +3762,11 @@ static void view3d_main_area_draw_objects(const bContext 
*C, Scene *scene, View3
        /* main drawing call */
        view3d_draw_objects(C, scene, v3d, ar, grid_unit, true, false, 
do_compositing ? rv3d->compositor : NULL);
 
+       /* widgets need to be updated *after* view matrix was set up
+        * XXX since we do 2 draw calls (with and without depth culling),
+        * it might be better to have 2 update calls, too */
+       WM_widgets_update(C, ar->widgetmaps.first);
+       /* draw depth culled widgets */
        WM_widgets_draw(C, ar->widgetmaps.first, true);
 
        /* post process */
@@ -3906,18 +3911,18 @@ void view3d_main_area_draw(const bContext *C, ARegion 
*ar)
        const char *grid_unit = NULL;
        rcti border_rect;
        bool render_border, clip_border;
+       bool update_widgets = true;
 
        /* if we only redraw render border area, skip opengl draw and also
         * don't do scissor because it's already set */
        render_border = ED_view3d_calc_render_border(scene, v3d, ar, 
&border_rect);
        clip_border = (render_border && !BLI_rcti_compare(&ar->drawrct, 
&border_rect));
 
-       WM_widgets_update(C, ar->widgetmaps.first);
-
        /* draw viewport using opengl */
        if (v3d->drawtype != OB_RENDER || 
!view3d_main_area_do_render_draw(scene) || clip_border) {
                view3d_main_area_draw_objects(C, scene, v3d, ar, &grid_unit);
-               
+               update_widgets = false; /* widgets were updated in 
view3d_main_area_draw_objects */
+
 #ifdef DEBUG_DRAW
                bl_debug_draw();
 #endif
@@ -3933,7 +3938,12 @@ 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);
+
+       if (update_widgets) {
+               WM_widgets_update(C, ar->widgetmaps.first);
+       }
        WM_widgets_draw(C, ar->widgetmaps.first, false);
+
        ED_region_pixelspace(ar);
        
        view3d_main_area_draw_info(C, scene, ar, v3d, grid_unit, render_border);
diff --git a/source/blender/windowmanager/intern/wm_widgets.c 
b/source/blender/windowmanager/intern/wm_widgets.c
index 0b81dc1..c53d078 100644
--- a/source/blender/windowmanager/intern/wm_widgets.c
+++ b/source/blender/windowmanager/intern/wm_widgets.c
@@ -276,8 +276,7 @@ void WM_widgets_update(const bContext *C, wmWidgetMap *wmap)
                wmWidgetGroup *wgroup;
 
                for (wgroup = wmap->widgetgroups.first; wgroup; wgroup = 
wgroup->next) {
-                       if (!wgroup->type->poll || wgroup->type->poll(C, 
wgroup->type))
-                       {
+                       if (!wgroup->type->poll || wgroup->type->poll(C, 
wgroup->type)) {
                                wmWidget *highlighted = NULL;
 
                                /* first delete and recreate the widgets */
@@ -356,7 +355,7 @@ void WM_widgets_draw(const bContext *C, const wmWidgetMap 
*wmap, const bool in_s
 
        widget = wmap->active_widget;
 
-       if (widget && in_scene == ((widget->flag & WM_WIDGET_SCENE_DEPTH)!= 0)) 
{
+       if (widget && in_scene == ((widget->flag & WM_WIDGET_SCENE_DEPTH) != 
0)) {
                /* notice that we don't update the widgetgroup, widget is now 
on its own, it should have all
                 * relevant data to update itself */
                widget->draw(C, widget);
@@ -365,8 +364,7 @@ void WM_widgets_draw(const bContext *C, const wmWidgetMap 
*wmap, const bool in_s
                wmWidgetGroup *wgroup;
                
                for (wgroup = wmap->widgetgroups.first; wgroup; wgroup = 
wgroup->next) {
-                       if (!wgroup->type->poll || wgroup->type->poll(C, 
wgroup->type))
-                       {
+                       if (!wgroup->type->poll || wgroup->type->poll(C, 
wgroup->type)) {
                                for (widget = wgroup->widgets.first; widget; 
widget = widget->next) {
                                        if ((widget->flag & WM_WIDGET_HIDDEN) 
== 0 &&
                                            (!(widget->flag & 
WM_WIDGET_DRAW_HOVER) || (widget->flag & WM_WIDGET_HIGHLIGHT)) &&

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

Reply via email to