From acc4507f1bc7c4b50b84661075ab0b656cfd091b Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Tue, 21 Aug 2018 10:59:01 +0200 Subject: Workbench: Support XRay rendering in OpenGL OpenGL rendering only implemented the deferred renderer. This commit will add the forward renderer. The forward renderer is used when XRay mode is enabled --- .../draw/engines/workbench/workbench_render.c | 69 ++++++++++++++++------ 1 file changed, 52 insertions(+), 17 deletions(-) (limited to 'source/blender/draw/engines/workbench/workbench_render.c') diff --git a/source/blender/draw/engines/workbench/workbench_render.c b/source/blender/draw/engines/workbench/workbench_render.c index 1b25d4c875c..78064b04fcd 100644 --- a/source/blender/draw/engines/workbench/workbench_render.c +++ b/source/blender/draw/engines/workbench/workbench_render.c @@ -40,13 +40,20 @@ #include "workbench_private.h" -static void workbench_render_cache( +static void workbench_render_deferred_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); +} + static void workbench_render_matrices_init(RenderEngine *engine, Depsgraph *depsgraph) { /* TODO(sergey): Shall render hold pointer to an evaluated camera instead? */ @@ -121,7 +128,7 @@ static void workbench_render_framebuffers_finish(void) void workbench_render(WORKBENCH_Data *data, RenderEngine *engine, RenderLayer *render_layer, const rcti *rect) { 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); @@ -130,27 +137,55 @@ void workbench_render(WORKBENCH_Data *data, RenderEngine *engine, RenderLayer *r return; } - /* Init engine. */ - workbench_deferred_engine_init(data); + const bool deferred = (scene->display.shading.flag & V3D_SHADING_XRAY) == 0; + + if (deferred) + { + /* Init engine. */ + workbench_deferred_engine_init(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(); - /* Init objects. */ - workbench_deferred_cache_init(data); - DRW_render_object_iter(data, engine, depsgraph, workbench_render_cache); - workbench_deferred_cache_finish(data); - DRW_render_instance_buffer_finish(); + /* 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; + } - /* 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_background(data); + workbench_deferred_draw_scene(data); } - workbench_deferred_draw_background(data); - workbench_deferred_draw_scene(data); + 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(); + + /* 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_forward_draw_background(data); + workbench_forward_draw_scene(data); + } - workbench_deferred_draw_finish(data); + workbench_forward_draw_finish(data); + } /* Write render output. */ const char *viewname = RE_GetActiveRenderView(engine->re); -- cgit v1.2.3