From 22f1dde2dcf4397cf7f584bcf63f843e55927b93 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Thu, 10 Dec 2020 22:15:44 +0300 Subject: [PATCH] Refactor deferred_renderer::render --- libs/gfx/source/renderer/deferred.cpp | 227 +++++--------------------- 1 file changed, 44 insertions(+), 183 deletions(-) diff --git a/libs/gfx/source/renderer/deferred.cpp b/libs/gfx/source/renderer/deferred.cpp index 6a6e63a0..21541cb0 100644 --- a/libs/gfx/source/renderer/deferred.cpp +++ b/libs/gfx/source/renderer/deferred.cpp @@ -938,6 +938,44 @@ void main() if (o.mat->casts_shadow) casts_shadow_bbox |= o.bbox; } + auto render_all = [&](auto & program, auto && predicate) + { + for (auto const & p : objects_by_mask) + { + std::uint32_t mask = p.first; + + if (!predicate(mask)) continue; + + if (p.second.empty()) continue; + + program["u_flag_mask"] = mask; + + for (std::size_t i : p.second) + { + auto const & o = objects[i]; + + if (mask & O_UNIFORM_COLOR) + program["u_color"] = *o.mat->color; + + if (mask & O_TEXTURE_COLOR) + { + gl::ActiveTexture(gl::TEXTURE0); + o.mat->texture->bind(); + } + + if (mask & O_PRE_TRANSFORM) + program["u_pre_transform"] = *o.pre_transform; + + if (mask & O_POST_TRANSFORM) + program["u_post_transform"] = *o.post_transform; + + program["u_material"] = geom::vector{o.mat->diffuse, o.mat->specular.intensity, o.mat->specular.shininess}; + + o.mesh->draw(); + } + } + }; + // Resize g-buffer if needed auto const buffer_size = geom::cast(target.viewport.dimensions()); @@ -1065,41 +1103,7 @@ void main() impl().g_buffer_pass_program["u_camera_transform"] = camera_transform; impl().g_buffer_pass_program["u_max_intensity"] = opts.max_intensity; - for (auto const & p : objects_by_mask) - { - std::uint32_t mask = p.first; - - if (mask & O_TRANSPARENT) - continue; - - if (p.second.empty()) continue; - - impl().g_buffer_pass_program["u_flag_mask"] = mask; - - for (std::size_t i : p.second) - { - auto const & o = objects[i]; - - if (mask & O_UNIFORM_COLOR) - impl().g_buffer_pass_program["u_color"] = *o.mat->color; - - if (mask & O_TEXTURE_COLOR) - { - gl::ActiveTexture(gl::TEXTURE0); - o.mat->texture->bind(); - } - - if (mask & O_PRE_TRANSFORM) - impl().g_buffer_pass_program["u_pre_transform"] = *o.pre_transform; - - if (mask & O_POST_TRANSFORM) - impl().g_buffer_pass_program["u_post_transform"] = *o.post_transform; - - impl().g_buffer_pass_program["u_material"] = geom::vector{o.mat->diffuse, o.mat->specular.intensity, o.mat->specular.shininess}; - - o.mesh->draw(); - } - } + render_all(impl().g_buffer_pass_program, [](auto mask){ return !(mask & O_TRANSPARENT); }); // Render unlit transparent objects @@ -1115,39 +1119,7 @@ void main() gl::DepthMask(gl::FALSE); - for (auto const & p : objects_by_mask) - { - std::uint32_t mask = p.first; - - if (!(mask & O_TRANSPARENT)) - continue; - - if (p.second.empty()) continue; - - impl().transparent_pass_program["u_flag_mask"] = mask; - - for (std::size_t i : p.second) - { - auto const & o = objects[i]; - - if (mask & O_UNIFORM_COLOR) - impl().transparent_pass_program["u_color"] = *o.mat->color; - - if (mask & O_TEXTURE_COLOR) - { - gl::ActiveTexture(gl::TEXTURE0); - o.mat->texture->bind(); - } - - if (mask & O_PRE_TRANSFORM) - impl().transparent_pass_program["u_pre_transform"] = *o.pre_transform; - - if (mask & O_POST_TRANSFORM) - impl().transparent_pass_program["u_post_transform"] = *o.post_transform; - - o.mesh->draw(); - } - } + render_all(impl().transparent_pass_program, [](auto mask){ return (mask & O_TRANSPARENT); }); // Render bloom @@ -1167,41 +1139,7 @@ void main() impl().bloom_pass_program["u_camera_transform"] = camera_transform; impl().bloom_pass_program["u_max_intensity"] = opts.max_intensity; - for (auto const & p : objects_by_mask) - { - std::uint32_t mask = p.first; - - if (!(mask & O_BLOOMING)) - continue; - - if (p.second.empty()) continue; - - impl().bloom_pass_program["u_flag_mask"] = mask; - - for (std::size_t i : p.second) - { - auto const & o = objects[i]; - - if (mask & O_UNIFORM_COLOR) - impl().bloom_pass_program["u_color"] = *o.mat->color; - - if (mask & O_TEXTURE_COLOR) - { - gl::ActiveTexture(gl::TEXTURE0); - o.mat->texture->bind(); - } - - if (mask & O_PRE_TRANSFORM) - impl().bloom_pass_program["u_pre_transform"] = *o.pre_transform; - - if (mask & O_POST_TRANSFORM) - impl().bloom_pass_program["u_post_transform"] = *o.post_transform; - - impl().bloom_pass_program["u_material"] = geom::vector{o.mat->diffuse, o.mat->specular.intensity, o.mat->specular.shininess}; - - o.mesh->draw(); - } - } + render_all(impl().bloom_pass_program, [](auto mask){ return (mask & O_BLOOMING); }); } // Render unlit transparent objects to bloom @@ -1215,40 +1153,7 @@ void main() gl::Enable(gl::BLEND); gl::BlendFuncSeparate(gl::SRC_ALPHA, gl::ONE_MINUS_SRC_ALPHA, gl::ZERO, gl::ONE); - for (auto const & p : objects_by_mask) - { - std::uint32_t mask = p.first; - - if (!(mask & O_TRANSPARENT)) - continue; - - if (p.second.empty()) continue; - - impl().transparent_pass_program["u_flag_mask"] = mask; - - for (std::size_t i : p.second) - { - auto const & o = objects[i]; - - if (mask & O_UNIFORM_COLOR) - impl().transparent_pass_program["u_color"] = *o.mat->color; - - if (mask & O_TEXTURE_COLOR) - { - gl::ActiveTexture(gl::TEXTURE0); - o.mat->texture->bind(); - } - - if (mask & O_PRE_TRANSFORM) - impl().transparent_pass_program["u_pre_transform"] = *o.pre_transform; - - if (mask & O_POST_TRANSFORM) - impl().transparent_pass_program["u_post_transform"] = *o.post_transform; - - o.mesh->draw(); - } - } - + render_all(impl().transparent_pass_program, [](auto mask){ return (mask & O_TRANSPARENT); }); } gl::Disable(gl::BLEND); @@ -1434,29 +1339,7 @@ void main() impl().shadow_builder_program.bind(); impl().shadow_builder_program["u_light_transform"] = light_transform; - for (auto const & p : objects_by_mask) - { - if (p.second.empty()) continue; - - std::uint32_t mask = p.first; - - if (!(mask & O_CASTS_SHADOW)) continue; - - impl().shadow_builder_program["u_flag_mask"] = mask; - - for (std::size_t i : p.second) - { - auto const & o = objects[i]; - - if (mask & O_PRE_TRANSFORM) - impl().shadow_builder_program["u_pre_transform"] = *o.pre_transform; - - if (mask & O_POST_TRANSFORM) - impl().shadow_builder_program["u_post_transform"] = *o.post_transform; - - o.mesh->draw(); - } - } + render_all(impl().shadow_builder_program, [](auto mask){ return (mask & O_CASTS_SHADOW); }); } target.bind(); @@ -1617,29 +1500,7 @@ void main() impl().cubemap_shadow_builder_program["u_layer_transform[4]"] = transform[4] * translate_by_light; impl().cubemap_shadow_builder_program["u_layer_transform[5]"] = transform[5] * translate_by_light; - for (auto const & p : objects_by_mask) - { - if (p.second.empty()) continue; - - std::uint32_t mask = p.first; - - if (!(mask & O_CASTS_SHADOW)) continue; - - impl().cubemap_shadow_builder_program["u_flag_mask"] = mask; - - for (std::size_t i : p.second) - { - auto const & o = objects[i]; - - if (mask & O_PRE_TRANSFORM) - impl().cubemap_shadow_builder_program["u_pre_transform"] = *o.pre_transform; - - if (mask & O_POST_TRANSFORM) - impl().cubemap_shadow_builder_program["u_post_transform"] = *o.post_transform; - - o.mesh->draw(); - } - } + render_all(impl().cubemap_shadow_builder_program, [](auto mask){ return (mask & O_CASTS_SHADOW); }); } target.bind();