diff options
author | Jeroen Bakker <j.bakker@atmind.nl> | 2018-08-21 11:59:01 +0300 |
---|---|---|
committer | Jeroen Bakker <j.bakker@atmind.nl> | 2018-08-21 12:00:46 +0300 |
commit | acc4507f1bc7c4b50b84661075ab0b656cfd091b (patch) | |
tree | 90f997efbe74be1a328acae81347a911449e8f7a /source/blender/draw/engines/workbench/workbench_render.c | |
parent | 79ecfc99fd75f897a6140639474a7b0e5910a9ff (diff) |
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
Diffstat (limited to 'source/blender/draw/engines/workbench/workbench_render.c')
-rw-r--r-- | source/blender/draw/engines/workbench/workbench_render.c | 69 |
1 files changed, 52 insertions, 17 deletions
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); |