[Bf-blender-cvs] [10678f7] wiggly-widgets: Fix 3D view widgets not updated correctly

Julian Eisel noreply at git.blender.org
Fri Sep 11 01:38:30 CEST 2015


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)) &&




More information about the Bf-blender-cvs mailing list