[Bf-blender-cvs] [c42e68c4845] eevee-motionblur-object: EEVEE: Motion Blur: Fix rendering and center sample on current frame

Clément Foucault noreply at git.blender.org
Tue Apr 14 19:09:13 CEST 2020


Commit: c42e68c48456b7e9b715054e9f19f8313d54659d
Author: Clément Foucault
Date:   Wed Apr 1 00:43:11 2020 +0200
Branches: eevee-motionblur-object
https://developer.blender.org/rBc42e68c48456b7e9b715054e9f19f8313d54659d

EEVEE: Motion Blur: Fix rendering and center sample on current frame

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

M	source/blender/draw/engines/eevee/eevee_engine.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/eevee_render.c

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

diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index c061bd830df..89be24ff9fb 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -423,30 +423,39 @@ static void eevee_render_to_image(void *vedata,
                                   struct RenderLayer *render_layer,
                                   const rcti *rect)
 {
+  EEVEE_Data *ved = (EEVEE_Data *)vedata;
   const DRWContextState *draw_ctx = DRW_context_state_get();
 
-  if (!EEVEE_render_init(vedata, engine, draw_ctx->depsgraph)) {
-    return;
-  }
-
-  DRW_render_object_iter(vedata, engine, draw_ctx->depsgraph, EEVEE_render_cache);
-
-  {
-    EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl;
-    memset(psl, 0, sizeof(*psl));
-
+  if (EEVEE_render_do_motion_blur(draw_ctx->depsgraph)) {
     float time = DEG_get_ctime(draw_ctx->depsgraph);
-    RE_engine_frame_set(engine, time - 1.0, 0.0f);
+    RE_engine_frame_set(engine, time - 1.0f, 0.0f);
 
-    EEVEE_render_init(vedata, engine, draw_ctx->depsgraph);
+    if (!EEVEE_render_init(vedata, engine, draw_ctx->depsgraph)) {
+      return;
+    }
 
     if (RE_engine_test_break(engine)) {
       return;
     }
 
     DRW_render_object_iter(vedata, engine, draw_ctx->depsgraph, EEVEE_render_cache);
+
+    RE_engine_frame_set(engine, time, 0.0f);
+
+    /* Reset passlist. This is safe as they are stored into managed memory chunks. */
+    memset(ved->psl, 0, sizeof(*ved->psl));
+  }
+
+  if (!EEVEE_render_init(vedata, engine, draw_ctx->depsgraph)) {
+    return;
   }
 
+  if (RE_engine_test_break(engine)) {
+    return;
+  }
+
+  DRW_render_object_iter(vedata, engine, draw_ctx->depsgraph, EEVEE_render_cache);
+
   /* Actually do the rendering. */
   EEVEE_render_draw(vedata, engine, render_layer, rect);
 
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index 3d43cc8d12e..81280d1c285 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -1219,6 +1219,7 @@ void EEVEE_render_draw(EEVEE_Data *vedata,
 void EEVEE_render_update_passes(struct RenderEngine *engine,
                                 struct Scene *scene,
                                 struct ViewLayer *view_layer);
+bool EEVEE_render_do_motion_blur(const struct Depsgraph *depsgraph);
 
 /** eevee_lookdev.c */
 void EEVEE_lookdev_cache_init(EEVEE_Data *vedata,
diff --git a/source/blender/draw/engines/eevee/eevee_render.c b/source/blender/draw/engines/eevee/eevee_render.c
index 076738dcbdf..06cef8948cf 100644
--- a/source/blender/draw/engines/eevee/eevee_render.c
+++ b/source/blender/draw/engines/eevee/eevee_render.c
@@ -46,6 +46,12 @@
 
 #include "eevee_private.h"
 
+bool EEVEE_render_do_motion_blur(const struct Depsgraph *depsgraph)
+{
+  Scene *scene = DEG_get_evaluated_scene(depsgraph);
+  return (scene->eevee.flag & SCE_EEVEE_MOTION_BLUR_ENABLED) != 0;
+}
+
 /* Return true if init properly. */
 bool EEVEE_render_init(EEVEE_Data *ved, RenderEngine *engine, struct Depsgraph *depsgraph)
 {
@@ -144,7 +150,9 @@ bool EEVEE_render_init(EEVEE_Data *ved, RenderEngine *engine, struct Depsgraph *
 
   DRWView *view = DRW_view_create(viewmat, winmat, NULL, NULL, NULL);
   DRW_view_camtexco_set(view, camtexcofac);
-  DRW_view_default_set(view);
+  if (DRW_view_default_get() == NULL) {
+    DRW_view_default_set(view);
+  }
   DRW_view_set_active(view);
 
   /* `EEVEE_renderpasses_init` will set the active render passes used by `EEVEE_effects_init`.



More information about the Bf-blender-cvs mailing list