[Bf-blender-cvs] [039d619c760] master: Fix T74898: Multiresolution Ghost After Orbiting

Jeroen Bakker noreply at git.blender.org
Tue Mar 31 10:30:18 CEST 2020


Commit: 039d619c760e1dccdc2d1674c30a300a3a21e312
Author: Jeroen Bakker
Date:   Tue Mar 31 10:26:41 2020 +0200
Branches: master
https://developer.blender.org/rB039d619c760e1dccdc2d1674c30a300a3a21e312

Fix T74898: Multiresolution Ghost After Orbiting

EEVEE and Workbench both had the same issue that they continue with the
last sample when leaving navigating. This is ok for regular meshes as
they are all the same. For multiresolution it ain't as a low res version
of the mesh is used during navigation.

This patch also resets the AA samples when the user leaves navigation.

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

M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/eevee_temporal_sampling.c
M	source/blender/draw/engines/workbench/workbench_data.c
M	source/blender/draw/engines/workbench/workbench_effect_antialiasing.c
M	source/blender/draw/engines/workbench/workbench_private.h
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.c

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

diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index e2470b4fa76..264f301e52c 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -600,6 +600,7 @@ typedef struct EEVEE_EffectsInfo {
   int taa_total_sample;
   float taa_alpha;
   bool prev_drw_support;
+  bool prev_is_navigating;
   float prev_drw_persmat[4][4];
   struct DRWView *taa_view;
   /* Ambient Occlusion */
diff --git a/source/blender/draw/engines/eevee/eevee_temporal_sampling.c b/source/blender/draw/engines/eevee/eevee_temporal_sampling.c
index 1f44b815a42..b70d872c4af 100644
--- a/source/blender/draw/engines/eevee/eevee_temporal_sampling.c
+++ b/source/blender/draw/engines/eevee/eevee_temporal_sampling.c
@@ -244,8 +244,10 @@ int EEVEE_temporal_sampling_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data
     copy_m4_m4(effects->prev_drw_persmat, persmat);
 
     /* Prevent ghosting from probe data. */
-    view_is_valid = view_is_valid && (effects->prev_drw_support == DRW_state_draw_support());
+    view_is_valid = view_is_valid && (effects->prev_drw_support == DRW_state_draw_support()) &&
+                    (effects->prev_is_navigating == DRW_state_is_navigating());
     effects->prev_drw_support = DRW_state_draw_support();
+    effects->prev_is_navigating = DRW_state_is_navigating();
 
     if (((effects->taa_total_sample == 0) ||
          (effects->taa_current_sample < effects->taa_total_sample)) ||
diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c
index fc047eadf55..6ef9cbfab57 100644
--- a/source/blender/draw/engines/workbench/workbench_data.c
+++ b/source/blender/draw/engines/workbench/workbench_data.c
@@ -182,7 +182,7 @@ void workbench_private_data_init(WORKBENCH_PrivateData *wpd)
   WORKBENCH_ViewLayerData *vldata = workbench_view_layer_data_ensure_ex(draw_ctx->view_layer);
 
   wpd->is_playback = DRW_state_is_playback();
-  wpd->is_navigating = rv3d && (rv3d->rflag & (RV3D_NAVIGATING | RV3D_PAINTING));
+  wpd->is_navigating = DRW_state_is_navigating();
 
   wpd->ctx_mode = CTX_data_mode_enum_ex(
       draw_ctx->object_edit, draw_ctx->obact, draw_ctx->object_mode);
diff --git a/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c b/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c
index a0db09e9273..094d13fb84c 100644
--- a/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c
+++ b/source/blender/draw/engines/workbench/workbench_effect_antialiasing.c
@@ -168,10 +168,17 @@ void workbench_antialiasing_engine_init(WORKBENCH_Data *vedata)
 
   wpd->view = NULL;
 
-  /* reset complete drawing when navigating or during viewport playback. */
+  /* Reset complete drawing when navigating or during viewport playback or when
+   * leaving one of those states. In case of multires modifier the navigation
+   * mesh differs from the viewport mesh, so we need to be sure to restart. */
   if (wpd->taa_sample != 0) {
     if (wpd->is_navigating || wpd->is_playback) {
       wpd->taa_sample = 0;
+      wpd->reset_next_sample = true;
+    }
+    else if (wpd->reset_next_sample) {
+      wpd->taa_sample = 0;
+      wpd->reset_next_sample = false;
     }
   }
 
diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h
index 87b1c82ce94..a5e80f417d3 100644
--- a/source/blender/draw/engines/workbench/workbench_private.h
+++ b/source/blender/draw/engines/workbench/workbench_private.h
@@ -333,6 +333,7 @@ typedef struct WORKBENCH_PrivateData {
   bool dof_enabled;
   bool is_playback;
   bool is_navigating;
+  bool reset_next_sample;
 } WORKBENCH_PrivateData; /* Transient data */
 
 typedef struct WORKBENCH_ObjectData {
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 382e7313f21..2d6d6c7d9d0 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -670,6 +670,7 @@ bool DRW_state_do_color_management(void);
 bool DRW_state_is_scene_render(void);
 bool DRW_state_is_opengl_render(void);
 bool DRW_state_is_playback(void);
+bool DRW_state_is_navigating(void);
 bool DRW_state_show_text(void);
 bool DRW_state_draw_support(void);
 bool DRW_state_draw_background(void);
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index cc618c76ccd..b265035f449 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -2574,6 +2574,15 @@ bool DRW_state_is_playback(void)
   return false;
 }
 
+/**
+ * Is the user navigating the region.
+ */
+bool DRW_state_is_navigating(void)
+{
+  const RegionView3D *rv3d = DST.draw_ctx.rv3d;
+  return (rv3d) && (rv3d->rflag & (RV3D_NAVIGATING | RV3D_PAINTING));
+}
+
 /**
  * Should text draw in this mode?
  */



More information about the Bf-blender-cvs mailing list