From 5cb74583a4e1724526cfe80aa605be706778e412 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Thu, 10 Dec 2020 21:57:26 +0300 Subject: [PATCH] Deferred renderer: accept material by pointer, casts_shadow is a property of material --- .../include/psemek/gfx/renderer/deferred.hpp | 4 +- libs/gfx/source/renderer/deferred.cpp | 42 +++++++++---------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/libs/gfx/include/psemek/gfx/renderer/deferred.hpp b/libs/gfx/include/psemek/gfx/renderer/deferred.hpp index e1de41e5..d3084898 100644 --- a/libs/gfx/include/psemek/gfx/renderer/deferred.hpp +++ b/libs/gfx/include/psemek/gfx/renderer/deferred.hpp @@ -36,6 +36,7 @@ namespace psemek::gfx bool transparent = false; bool lit = true; bool blooming = false; + bool casts_shadow = true; float diffuse = 1.f; struct @@ -59,8 +60,7 @@ namespace psemek::gfx // 4 - mat3x4 per-instance transform (used in conjunction with transform) gfx::mesh const * mesh = nullptr; - material mat; - bool casts_shadow = true; + material const * mat = nullptr; geom::box bbox; std::optional> pre_transform; std::optional> post_transform; diff --git a/libs/gfx/source/renderer/deferred.cpp b/libs/gfx/source/renderer/deferred.cpp index 421a61b2..6a6e63a0 100644 --- a/libs/gfx/source/renderer/deferred.cpp +++ b/libs/gfx/source/renderer/deferred.cpp @@ -889,15 +889,15 @@ void main() std::uint32_t mask(deferred_renderer::object const & o) { std::uint32_t m = 0; - if (o.mat.color) m |= O_UNIFORM_COLOR; - if (o.mat.texture) m |= O_TEXTURE_COLOR; - if (o.mat.transparent) m |= O_TRANSPARENT; - if (o.mat.lit) m |= O_LIT; - if (o.casts_shadow) m |= O_CASTS_SHADOW; + if (o.mat->color) m |= O_UNIFORM_COLOR; + if (o.mat->texture) m |= O_TEXTURE_COLOR; + if (o.mat->transparent) m |= O_TRANSPARENT; + if (o.mat->lit) m |= O_LIT; + if (o.mat->casts_shadow) m |= O_CASTS_SHADOW; if (o.pre_transform) m |= O_PRE_TRANSFORM; if (o.post_transform) m |= O_POST_TRANSFORM; if (o.mesh->is_instanced()) m |= O_INSTANCED; - if (o.mat.blooming) m |= O_BLOOMING; + if (o.mat->blooming) m |= O_BLOOMING; return m; } @@ -923,19 +923,19 @@ void main() auto const & o = objects[i]; assert(o.mesh); - if (o.mat.lit && o.mat.transparent) + if (o.mat->lit && o.mat->transparent) throw std::runtime_error("Materials that are both tit & transparent are not supported"); - if (o.mat.lit && o.mat.blooming) + if (o.mat->lit && o.mat->blooming) throw std::runtime_error("Materials that are both tit & blooming are not supported"); - if (o.casts_shadow && o.mat.transparent) + if (o.mat->casts_shadow && o.mat->transparent) throw std::runtime_error("Transparent objects cannot cast shadow"); objects_by_mask[mask(objects[i])].push_back(i); - if (o.mat.lit) lit_bbox |= o.bbox; - if (o.casts_shadow) casts_shadow_bbox |= o.bbox; + if (o.mat->lit) lit_bbox |= o.bbox; + if (o.mat->casts_shadow) casts_shadow_bbox |= o.bbox; } // Resize g-buffer if needed @@ -1081,12 +1081,12 @@ void main() auto const & o = objects[i]; if (mask & O_UNIFORM_COLOR) - impl().g_buffer_pass_program["u_color"] = *o.mat.color; + impl().g_buffer_pass_program["u_color"] = *o.mat->color; if (mask & O_TEXTURE_COLOR) { gl::ActiveTexture(gl::TEXTURE0); - o.mat.texture->bind(); + o.mat->texture->bind(); } if (mask & O_PRE_TRANSFORM) @@ -1095,7 +1095,7 @@ void main() 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}; + impl().g_buffer_pass_program["u_material"] = geom::vector{o.mat->diffuse, o.mat->specular.intensity, o.mat->specular.shininess}; o.mesh->draw(); } @@ -1131,12 +1131,12 @@ void main() auto const & o = objects[i]; if (mask & O_UNIFORM_COLOR) - impl().transparent_pass_program["u_color"] = *o.mat.color; + impl().transparent_pass_program["u_color"] = *o.mat->color; if (mask & O_TEXTURE_COLOR) { gl::ActiveTexture(gl::TEXTURE0); - o.mat.texture->bind(); + o.mat->texture->bind(); } if (mask & O_PRE_TRANSFORM) @@ -1183,12 +1183,12 @@ void main() auto const & o = objects[i]; if (mask & O_UNIFORM_COLOR) - impl().bloom_pass_program["u_color"] = *o.mat.color; + impl().bloom_pass_program["u_color"] = *o.mat->color; if (mask & O_TEXTURE_COLOR) { gl::ActiveTexture(gl::TEXTURE0); - o.mat.texture->bind(); + o.mat->texture->bind(); } if (mask & O_PRE_TRANSFORM) @@ -1197,7 +1197,7 @@ void main() 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}; + impl().bloom_pass_program["u_material"] = geom::vector{o.mat->diffuse, o.mat->specular.intensity, o.mat->specular.shininess}; o.mesh->draw(); } @@ -1231,12 +1231,12 @@ void main() auto const & o = objects[i]; if (mask & O_UNIFORM_COLOR) - impl().transparent_pass_program["u_color"] = *o.mat.color; + impl().transparent_pass_program["u_color"] = *o.mat->color; if (mask & O_TEXTURE_COLOR) { gl::ActiveTexture(gl::TEXTURE0); - o.mat.texture->bind(); + o.mat->texture->bind(); } if (mask & O_PRE_TRANSFORM)