diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2020-03-11 19:07:43 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2020-03-11 19:12:16 +0300 |
commit | c476c36e400883d929a7149def8dcb6ad6157a86 (patch) | |
tree | c19c43ad1ed82f333c08bee7d2096024fed812dd /source/blender/draw/engines/workbench/workbench_render.c | |
parent | f01bc597a8e6bf5df19f1af0c422918c96b25e41 (diff) |
Workbench Simplification Refactor
This patch is (almost) a complete rewrite of workbench engine.
The features remain unchanged but the code quality is greatly improved.
Hair shading is brighter but also more correct.
This also introduce the concept of `DRWShaderLibrary` to make a simple
include system inside the GLSL files.
Differential Revision: https://developer.blender.org/D7060
Diffstat (limited to 'source/blender/draw/engines/workbench/workbench_render.c')
-rw-r--r-- | source/blender/draw/engines/workbench/workbench_render.c | 95 |
1 files changed, 25 insertions, 70 deletions
diff --git a/source/blender/draw/engines/workbench/workbench_render.c b/source/blender/draw/engines/workbench/workbench_render.c index 6e005e7ccaf..5a315e80a47 100644 --- a/source/blender/draw/engines/workbench/workbench_render.c +++ b/source/blender/draw/engines/workbench/workbench_render.c @@ -41,20 +41,12 @@ #include "workbench_private.h" -static void workbench_render_deferred_cache(void *vedata, - struct Object *ob, - struct RenderEngine *UNUSED(engine), - struct Depsgraph *UNUSED(depsgraph)) +static void workbench_render_cache(void *vedata, + struct Object *ob, + struct RenderEngine *UNUSED(engine), + struct Depsgraph *UNUSED(depsgraph)) { - workbench_deferred_solid_cache_populate(vedata, ob); -} - -static void workbench_render_forward_cache(void *vedata, - struct Object *ob, - struct RenderEngine *UNUSED(engine), - struct Depsgraph *UNUSED(depsgraph)) -{ - workbench_forward_cache_populate(vedata, ob); + workbench_cache_populate(vedata, ob); } static void workbench_render_matrices_init(RenderEngine *engine, Depsgraph *depsgraph) @@ -171,18 +163,11 @@ static void workbench_render_result_z(struct RenderLayer *rl, } } -static void workbench_render_framebuffers_finish(void) -{ -} - -void workbench_render(WORKBENCH_Data *data, - RenderEngine *engine, - RenderLayer *render_layer, - const rcti *rect) +void workbench_render(void *ved, RenderEngine *engine, RenderLayer *render_layer, const rcti *rect) { + WORKBENCH_Data *data = ved; DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); const DRWContextState *draw_ctx = DRW_context_state_get(); - const Scene *scene = draw_ctx->scene; Depsgraph *depsgraph = draw_ctx->depsgraph; workbench_render_matrices_init(engine, depsgraph); @@ -191,60 +176,32 @@ void workbench_render(WORKBENCH_Data *data, return; } - const bool deferred = !XRAY_FLAG_ENABLED(&scene->display); + workbench_engine_init(data); - if (deferred) { - /* Init engine. */ - workbench_deferred_engine_init(data); + workbench_cache_init(data); + DRW_render_object_iter(data, engine, depsgraph, workbench_render_cache); + workbench_cache_finish(data); - /* Init objects. */ - workbench_deferred_cache_init(data); - DRW_render_object_iter(data, engine, depsgraph, workbench_render_deferred_cache); - workbench_deferred_cache_finish(data); - DRW_render_instance_buffer_finish(); + DRW_render_instance_buffer_finish(); - /* Also we weed to have a correct fbo bound for DRW_hair_update */ - GPU_framebuffer_bind(dfbl->color_only_fb); - DRW_hair_update(); - - /* Draw. */ - int num_samples = workbench_taa_calculate_num_iterations(data); - for (int sample = 0; sample < num_samples; sample++) { - if (RE_engine_test_break(engine)) { - break; - } - workbench_deferred_draw_scene(data); - } + /* Also we weed to have a correct fbo bound for DRW_hair_update */ + GPU_framebuffer_bind(dfbl->default_fb); + DRW_hair_update(); - workbench_deferred_draw_finish(data); - } - else { - /* Init engine. */ - workbench_forward_engine_init(data); - - /* Init objects. */ - workbench_forward_cache_init(data); - DRW_render_object_iter(data, engine, depsgraph, workbench_render_forward_cache); - workbench_forward_cache_finish(data); - DRW_render_instance_buffer_finish(); - - /* Also we weed to have a correct fbo bound for DRW_hair_update */ - GPU_framebuffer_bind(dfbl->color_only_fb); - DRW_hair_update(); - - /* Draw. */ - int num_samples = workbench_taa_calculate_num_iterations(data); - for (int sample = 0; sample < num_samples; sample++) { - if (RE_engine_test_break(engine)) { - break; - } + GPU_framebuffer_bind(dfbl->default_fb); + GPU_framebuffer_clear_depth(dfbl->default_fb, 1.0f); - workbench_forward_draw_scene(data); + WORKBENCH_PrivateData *wpd = data->stl->wpd; + while (wpd->taa_sample < max_ii(1, wpd->taa_sample_len)) { + if (RE_engine_test_break(engine)) { + break; } - - workbench_forward_draw_finish(data); + workbench_update_world_ubo(wpd); + workbench_draw_sample(data); } + workbench_draw_finish(data); + /* Write render output. */ const char *viewname = RE_GetActiveRenderView(engine->re); RenderPass *rp = RE_pass_find_by_name(render_layer, RE_PASSNAME_COMBINED, viewname); @@ -260,8 +217,6 @@ void workbench_render(WORKBENCH_Data *data, rp->rect); workbench_render_result_z(render_layer, viewname, rect); - - workbench_render_framebuffers_finish(); } void workbench_render_update_passes(RenderEngine *engine, Scene *scene, ViewLayer *view_layer) |