From af0165f8afc25273d28e6b2393e66b16819b5cfe Mon Sep 17 00:00:00 2001 From: Steffen Ohrendorf Date: Tue, 26 Oct 2021 21:20:12 +0200 Subject: [PATCH] make local shader time invariant across effect pipeline reconstructions --- src/render/pass/effectpass.cpp | 10 ++++++---- src/render/pass/effectpass.h | 11 ++++++++--- src/render/renderpipeline.cpp | 2 +- src/render/renderpipeline.h | 9 +++++++++ 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/render/pass/effectpass.cpp b/src/render/pass/effectpass.cpp index c0e0d4985..d39960560 100644 --- a/src/render/pass/effectpass.cpp +++ b/src/render/pass/effectpass.cpp @@ -1,6 +1,7 @@ #include "effectpass.h" #include "config.h" +#include "render/renderpipeline.h" #include "render/scene/mesh.h" #include "render/scene/rendercontext.h" #include "render/scene/rendermode.h" @@ -28,10 +29,12 @@ class Node; namespace render::pass { -EffectPass::EffectPass(std::string name, +EffectPass::EffectPass(gsl::not_null renderPipeline, + std::string name, gsl::not_null> material, const gsl::not_null>>>& input) - : m_name{std::move(name)} + : m_renderPipeline{std::move(renderPipeline)} + , m_name{std::move(name)} , m_material{std::move(material)} , m_mesh{scene::createScreenQuad(m_material, m_name)} , m_colorBuffer{std::make_shared>(input->getTexture()->size(), m_name + "-color")} @@ -69,8 +72,7 @@ void EffectPass::render(bool inWater) m_mesh->bind("u_time", [this](const scene::Node&, const scene::Mesh& /*mesh*/, gl::Uniform& uniform) { - const auto now = std::chrono::duration_cast( - std::chrono::high_resolution_clock::now() - m_creationTime); + const auto now = m_renderPipeline->getLocalTime(); uniform.set(gsl::narrow_cast(now.count())); }); m_mesh->render(context); diff --git a/src/render/pass/effectpass.h b/src/render/pass/effectpass.h index 1353719b1..a7a153633 100644 --- a/src/render/pass/effectpass.h +++ b/src/render/pass/effectpass.h @@ -1,6 +1,5 @@ #pragma once -#include #include #include #include @@ -8,6 +7,11 @@ #include #include +namespace render +{ +class RenderPipeline; +} + namespace render::scene { class Material; @@ -19,7 +23,8 @@ namespace render::pass class EffectPass final { public: - explicit EffectPass(std::string name, + explicit EffectPass(gsl::not_null renderPipeline, + std::string name, gsl::not_null> material, const gsl::not_null>>>& input); @@ -42,12 +47,12 @@ class EffectPass final } private: + const gsl::not_null m_renderPipeline; const std::string m_name; const gsl::not_null> m_material; gsl::not_null> m_mesh; gsl::not_null>> m_colorBuffer; gsl::not_null>>> m_colorBufferHandle; gsl::not_null> m_fb; - const std::chrono::high_resolution_clock::time_point m_creationTime = std::chrono::high_resolution_clock::now(); }; } // namespace render::pass diff --git a/src/render/renderpipeline.cpp b/src/render/renderpipeline.cpp index 78f680c86..b3d2fa9f2 100644 --- a/src/render/renderpipeline.cpp +++ b/src/render/renderpipeline.cpp @@ -80,7 +80,7 @@ void RenderPipeline::resize(scene::MaterialManager& materialManager, auto addEffect = [this, &fxSource](const std::string& name, const gsl::not_null>& material) { - auto fx = std::make_shared("fx:" + name, material, fxSource); + auto fx = std::make_shared(gsl::not_null{this}, "fx:" + name, material, fxSource); m_effects.emplace_back(fx); fxSource = fx->getOutput(); return fx; diff --git a/src/render/renderpipeline.h b/src/render/renderpipeline.h index 95ce475ab..d11eb3cfd 100644 --- a/src/render/renderpipeline.h +++ b/src/render/renderpipeline.h @@ -2,6 +2,7 @@ #include "rendersettings.h" +#include #include #include #include @@ -33,6 +34,8 @@ class EffectPass; class RenderPipeline { private: + const std::chrono::high_resolution_clock::time_point m_creationTime = std::chrono::high_resolution_clock::now(); + RenderSettings m_renderSettings{}; glm::ivec2 m_renderSize{-1}; glm::ivec2 m_displaySize{-1}; @@ -63,5 +66,11 @@ class RenderPipeline bool force = false); void apply(const RenderSettings& renderSettings, scene::MaterialManager& materialManager); + + [[nodiscard]] auto getLocalTime() const + { + return std::chrono::duration_cast(std::chrono::high_resolution_clock::now() + - m_creationTime); + } }; } // namespace render