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 | |
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
4 files changed, 60 insertions, 17 deletions
diff --git a/source/blender/draw/engines/workbench/transparent_mode.c b/source/blender/draw/engines/workbench/transparent_mode.c index 195b8371165..8d76da2763b 100644 --- a/source/blender/draw/engines/workbench/transparent_mode.c +++ b/source/blender/draw/engines/workbench/transparent_mode.c @@ -69,6 +69,7 @@ static void workbench_transparent_draw_scene(void *vedata) { WORKBENCH_Data *data = vedata; workbench_forward_draw_scene(data); + workbench_forward_draw_finish(data); } static void workbench_transparent_engine_free(void) diff --git a/source/blender/draw/engines/workbench/workbench_forward.c b/source/blender/draw/engines/workbench/workbench_forward.c index c31164447db..410c693689f 100644 --- a/source/blender/draw/engines/workbench/workbench_forward.c +++ b/source/blender/draw/engines/workbench/workbench_forward.c @@ -626,6 +626,12 @@ void workbench_forward_draw_scene(WORKBENCH_Data *vedata) /* Apply checker pattern */ GPU_framebuffer_bind(dfbl->depth_only_fb); DRW_draw_pass(psl->checker_depth_pass); +} + +void workbench_forward_draw_finish(WORKBENCH_Data *vedata) +{ + WORKBENCH_StorageList *stl = vedata->stl; + WORKBENCH_PrivateData *wpd = stl->g_data; workbench_private_data_free(wpd); workbench_volume_smoke_textures_free(wpd); diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h index 11a52fb06a1..bb013691602 100644 --- a/source/blender/draw/engines/workbench/workbench_private.h +++ b/source/blender/draw/engines/workbench/workbench_private.h @@ -258,6 +258,7 @@ void workbench_forward_engine_init(WORKBENCH_Data *vedata); void workbench_forward_engine_free(void); void workbench_forward_draw_background(WORKBENCH_Data *vedata); void workbench_forward_draw_scene(WORKBENCH_Data *vedata); +void workbench_forward_draw_finish(WORKBENCH_Data *vedata); void workbench_forward_cache_init(WORKBENCH_Data *vedata); void workbench_forward_cache_populate(WORKBENCH_Data *vedata, Object *ob); void workbench_forward_cache_finish(WORKBENCH_Data *vedata); 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); |