#pragma once #include #include #include #include #include namespace td { namespace render { class BasicRenderer { public: virtual void Render(float a_Lerp) = 0; virtual ~BasicRenderer() {} void Render(const GL::VertexArray& a_Vao); }; template class Renderer : public BasicRenderer, public utils::SlotGuard { protected: std::unique_ptr m_Shader; Camera& m_Camera; public: Renderer(Camera& a_Camera); virtual ~Renderer() {} template float Lerp(const T& a_Mob, float a_LerpFactor, const std::function& a_MemberGetter) { return static_cast(maths::Lerp(a_MemberGetter(a_Mob), a_MemberGetter(*a_Mob.m_Next), a_LerpFactor)); } }; class RenderPipeline { private: std::vector> m_Renderers; public: RenderPipeline(); virtual ~RenderPipeline() {} template void AddRenderer(Args&&... args) { m_Renderers.push_back(std::make_unique(args...)); } void Clear() { m_Renderers.clear(); } void Render(float a_Lerp) { for (auto& renderer : m_Renderers) { renderer->Render(a_Lerp); } } }; template Renderer::Renderer(Camera& a_Camera) : m_Shader(std::make_unique()), m_Camera(a_Camera) { Connect(a_Camera.OnPerspectiveChange, [this](){ m_Shader->Start(); m_Shader->SetProjectionMatrix(m_Camera.GetProjectionMatrix()); }); Connect(a_Camera.OnViewChange, [this]() { m_Shader->Start(); m_Shader->SetViewMatrix(m_Camera.GetViewMatrix()); }); } } // namespace render } // namespace td