[Bf-blender-cvs] [133bf05b184] blender-v2.83-release: Fix T75736 Viewport update problem when switching between view layers

Clément Foucault noreply at git.blender.org
Mon Apr 27 21:14:59 CEST 2020


Commit: 133bf05b184bfeed3002be28c29199b5716b8f1e
Author: Clément Foucault
Date:   Mon Apr 27 21:13:53 2020 +0200
Branches: blender-v2.83-release
https://developer.blender.org/rB133bf05b184bfeed3002be28c29199b5716b8f1e

Fix T75736 Viewport update problem when switching between view layers

The problem comes from the fact by no data being modified when switching
viewlayers.

To follow what the external render engines do, we completely reset the
viewport by freeing the GPUViewport to avoid any cached data from being
kept.

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

M	source/blender/draw/engines/workbench/workbench_data.c
M	source/blender/editors/screen/screen_edit.c
M	source/blender/editors/space_view3d/space_view3d.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm_draw.c

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

diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c
index 24d95a13ee8..2e8119fca2f 100644
--- a/source/blender/draw/engines/workbench/workbench_data.c
+++ b/source/blender/draw/engines/workbench/workbench_data.c
@@ -217,8 +217,7 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
   if (!v3d || (v3d->shading.type == OB_RENDER && BKE_scene_uses_blender_workbench(scene))) {
     /* FIXME: This reproduce old behavior when workbench was separated in 2 engines.
      * But this is a workaround for a missing update tagging from operators. */
-    if (scene->display.shading.type != wpd->shading.type ||
-        (v3d && (XRAY_ENABLED(v3d) != XRAY_ENABLED(&scene->display))) ||
+    if ((v3d && (XRAY_ENABLED(v3d) != XRAY_ENABLED(&scene->display))) ||
         (scene->display.shading.flag != wpd->shading.flag)) {
       wpd->view_updated = true;
     }
@@ -245,8 +244,7 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
   else {
     /* FIXME: This reproduce old behavior when workbench was separated in 2 engines.
      * But this is a workaround for a missing update tagging from operators. */
-    if (v3d->shading.type != wpd->shading.type || XRAY_ENABLED(v3d) != XRAY_ENABLED(wpd) ||
-        v3d->shading.flag != wpd->shading.flag) {
+    if (XRAY_ENABLED(v3d) != XRAY_ENABLED(wpd) || v3d->shading.flag != wpd->shading.flag) {
       wpd->view_updated = true;
     }
 
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index 8608c18c988..83edb2c3aca 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -547,7 +547,7 @@ void ED_region_exit(bContext *C, ARegion *region)
 
   WM_event_remove_handlers(C, &region->handlers);
   WM_event_modal_handler_region_replace(win, region, NULL);
-  WM_draw_region_free(region);
+  WM_draw_region_free(region, true);
 
   if (region->headerstr) {
     MEM_freeN(region->headerstr);
diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c
index 226e6617a71..a5c99016434 100644
--- a/source/blender/editors/space_view3d/space_view3d.c
+++ b/source/blender/editors/space_view3d/space_view3d.c
@@ -238,6 +238,9 @@ void ED_view3d_stop_render_preview(wmWindowManager *wm, ARegion *region)
     RE_engine_free(rv3d->render_engine);
     rv3d->render_engine = NULL;
   }
+
+  /* A bit overkill but this make sure the viewport is reset completely. (fclem) */
+  WM_draw_region_free(region, false);
 }
 
 void ED_view3d_shade_update(Main *bmain, View3D *v3d, ScrArea *area)
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 4118794d5b3..2f540262a66 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -773,7 +773,7 @@ void WM_draw_region_viewport_bind(struct ARegion *region);
 void WM_draw_region_viewport_unbind(struct ARegion *region);
 
 /* Region drawing */
-void WM_draw_region_free(struct ARegion *region);
+void WM_draw_region_free(struct ARegion *region, bool hide);
 struct GPUViewport *WM_draw_region_get_viewport(struct ARegion *region);
 struct GPUViewport *WM_draw_region_get_bound_viewport(struct ARegion *region);
 
diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c
index d3cd31c6e97..302de6609d0 100644
--- a/source/blender/windowmanager/intern/wm_draw.c
+++ b/source/blender/windowmanager/intern/wm_draw.c
@@ -1037,10 +1037,12 @@ void wm_draw_region_clear(wmWindow *win, ARegion *UNUSED(region))
   screen->do_draw = true;
 }
 
-void WM_draw_region_free(ARegion *region)
+void WM_draw_region_free(ARegion *region, bool hide)
 {
   wm_draw_region_buffer_free(region);
-  region->visible = 0;
+  if (hide) {
+    region->visible = 0;
+  }
 }
 
 void wm_draw_region_test(bContext *C, ScrArea *area, ARegion *region)



More information about the Bf-blender-cvs mailing list