Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen Bakker <j.bakker@atmind.nl>2018-08-21 11:59:01 +0300
committerJeroen Bakker <j.bakker@atmind.nl>2018-08-21 12:00:46 +0300
commitacc4507f1bc7c4b50b84661075ab0b656cfd091b (patch)
tree90f997efbe74be1a328acae81347a911449e8f7a /source/blender/draw/engines/workbench/workbench_render.c
parent79ecfc99fd75f897a6140639474a7b0e5910a9ff (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.c69
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);