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.
This commit is contained in:
Clément Foucault 2020-04-27 21:13:53 +02:00
parent 84e40ee846
commit 133bf05b18
Notes: blender-bot 2023-02-13 23:21:42 +01:00
Referenced by issue #76182, Bake All Physics operator bake all except Hair Physics
Referenced by issue #75736, Viewport update problem when switching between view layers
Referenced by issue #74243, Workbench x-ray, wireframe and anti-aliasing artifacts on NVIDIA / Linux
5 changed files with 11 additions and 8 deletions

View File

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

View File

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

View File

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

View File

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

View File

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