|
|
|
|
@@ -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;
|
|
|
|
|
|
|
|
|
|
/* 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();
|
|
|
|
|
if (deferred)
|
|
|
|
|
{
|
|
|
|
|
/* Init engine. */
|
|
|
|
|
workbench_deferred_engine_init(data);
|
|
|
|
|
|
|
|
|
|
/* 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;
|
|
|
|
|
/* 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();
|
|
|
|
|
|
|
|
|
|
/* 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);
|
|
|
|
|
|
|
|
|
|
workbench_deferred_draw_finish(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_forward_draw_finish(data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Write render output. */
|
|
|
|
|
const char *viewname = RE_GetActiveRenderView(engine->re);
|
|
|
|
|
|