diff options
author | Jeroen Bakker <jbakker> | 2020-03-17 10:57:04 +0300 |
---|---|---|
committer | Jeroen Bakker <jeroen@blender.org> | 2020-03-20 09:47:04 +0300 |
commit | 8ba9efb7d8ff399aaf3c65fd14272d0bc6f2ab39 (patch) | |
tree | 9a515c7fd5748f151e086bcdf33700961334cd0c /source | |
parent | 4fc45c7a2b75df1a0e07150c101b664e189550b7 (diff) |
Fix T74811: GreasePencil Stereo Rendering
When using grease pencil in a stereo rendering the grease pencil objects are
only visible in the left eye. In the viewport it renders both.
Issue is related that `DRW_render_gpencil` only renders a single view. But
`DRW_render_to_image` renders all views. This patch puts this in a loop to
render both eyes.
Reviewed By: fclem
Differential Revision: https://developer.blender.org/D7154
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/draw/engines/gpencil/gpencil_render.c | 19 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.c | 25 |
2 files changed, 29 insertions, 15 deletions
diff --git a/source/blender/draw/engines/gpencil/gpencil_render.c b/source/blender/draw/engines/gpencil/gpencil_render.c index 083b04c0600..496122c0483 100644 --- a/source/blender/draw/engines/gpencil/gpencil_render.c +++ b/source/blender/draw/engines/gpencil/gpencil_render.c @@ -104,10 +104,21 @@ void GPENCIL_render_init(GPENCIL_Data *vedata, /* FIXME(fclem): we have a precision loss in the depth buffer because of this reupload. * Find where it comes from! */ - txl->render_depth_tx = DRW_texture_create_2d( - size[0], size[1], GPU_DEPTH_COMPONENT24, 0, do_region ? NULL : pix_z); - txl->render_color_tx = DRW_texture_create_2d( - size[0], size[1], GPU_RGBA16F, 0, do_region ? NULL : pix_col); + /* In multi view render the textures can be reused. */ + if (txl->render_depth_tx && !do_clear_z) { + GPU_texture_update(txl->render_depth_tx, GPU_DATA_FLOAT, pix_z); + } + else { + txl->render_depth_tx = DRW_texture_create_2d( + size[0], size[1], GPU_DEPTH_COMPONENT24, 0, do_region ? NULL : pix_z); + } + if (txl->render_color_tx && !do_clear_col) { + GPU_texture_update(txl->render_color_tx, GPU_DATA_FLOAT, pix_col); + } + else { + txl->render_color_tx = DRW_texture_create_2d( + size[0], size[1], GPU_RGBA16F, 0, do_region ? NULL : pix_col); + } GPU_framebuffer_ensure_config(&fbl->render_fb, { diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index adaa1dd6151..cc618c76ccd 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -1627,6 +1627,13 @@ bool DRW_render_check_grease_pencil(Depsgraph *depsgraph) return false; } +static void drw_view_reset(void) +{ + DST.view_default = NULL; + DST.view_active = NULL; + DST.view_previous = NULL; +} + static void DRW_render_gpencil_to_image(RenderEngine *engine, struct RenderLayer *render_layer, const rcti *rect) @@ -1701,10 +1708,13 @@ void DRW_render_gpencil(struct RenderEngine *engine, struct Depsgraph *depsgraph RenderResult *render_result = RE_engine_get_result(engine); RenderLayer *render_layer = RE_GetRenderLayer(render_result, view_layer->name); - - DST.buffer_finish_called = false; - - DRW_render_gpencil_to_image(engine, render_layer, &render_rect); + for (RenderView *render_view = render_result->views.first; render_view != NULL; + render_view = render_view->next) { + RE_SetActiveRenderView(render, render_view->name); + drw_view_reset(); + DST.buffer_finish_called = false; + DRW_render_gpencil_to_image(engine, render_layer, &render_rect); + } /* Force cache to reset. */ drw_viewport_cache_resize(); @@ -1728,13 +1738,6 @@ void DRW_render_gpencil(struct RenderEngine *engine, struct Depsgraph *depsgraph DST.buffer_finish_called = false; } -static void drw_view_reset(void) -{ - DST.view_default = NULL; - DST.view_active = NULL; - DST.view_previous = NULL; -} - void DRW_render_to_image(RenderEngine *engine, struct Depsgraph *depsgraph) { Scene *scene = DEG_get_evaluated_scene(depsgraph); |