Files
Seele/src/Engine/Graphics/RenderPass/RenderGraph.h
T

96 lines
2.2 KiB
C++
Raw Normal View History

2021-05-06 17:02:10 +02:00
#pragma once
2022-11-17 16:47:42 +01:00
#include "RenderPass.h"
2021-05-06 17:02:10 +02:00
namespace Seele
{
2022-11-17 16:47:42 +01:00
template<typename... RenderPasses>
class RenderGraph;
2021-10-01 19:55:04 +02:00
2022-11-17 16:47:42 +01:00
template<>
class RenderGraph<>
2021-05-06 17:02:10 +02:00
{
public:
2022-11-17 16:47:42 +01:00
RenderGraph(PRenderGraphResources) {}
void updatePassData() {}
2021-10-01 19:55:04 +02:00
protected:
2022-11-17 16:47:42 +01:00
void setViewport(Gfx::PViewport) {}
void createRenderPass() {}
void beginFrame(const Component::Camera&) {}
void render() {}
void endFrame() {}
2021-05-06 17:02:10 +02:00
};
2022-11-17 16:47:42 +01:00
template<typename This, typename... Rest>
class RenderGraph<This, Rest...> : private RenderGraph<Rest...>
{
public:
2023-11-05 10:36:01 +01:00
RenderGraph(PRenderGraphResources resources, This pass, Rest... rest)
2022-11-17 16:47:42 +01:00
: RenderGraph<Rest...>(resources, std::move(rest)...)
, resources(resources)
, rp(std::move(pass))
{
rp.setResources(resources);
}
template<typename PassData, typename... OtherData>
void updatePassData(PassData passData, OtherData... otherData)
{
rp.updateViewFrame(std::move(passData));
RenderGraph<Rest...>::updatePassData(otherData...);
}
void updateViewport(Gfx::PViewport viewport)
{
setViewport(viewport);
createRenderPass();
}
void render(const Component::Camera& cam)
{
beginFrame(cam);
render();
endFrame();
}
protected:
void setViewport(Gfx::PViewport viewport)
{
rp.setViewport(viewport);
RenderGraph<Rest...>::setViewport(viewport);
}
void createRenderPass()
{
rp.createRenderPass();
RenderGraph<Rest...>::createRenderPass();
}
void beginFrame(const Component::Camera& cam)
{
rp.beginFrame(cam);
RenderGraph<Rest...>::beginFrame(cam);
}
void render()
{
rp.render();
RenderGraph<Rest...>::render();
}
void endFrame()
{
rp.endFrame();
RenderGraph<Rest...>::endFrame();
}
private:
PRenderGraphResources resources;
This rp;
};
class RenderGraphBuilder
{
public:
template<typename... RenderPasses>
2023-11-05 10:36:01 +01:00
static RenderGraph<RenderPasses...> build(RenderPasses... renderPasses)
2022-11-17 16:47:42 +01:00
{
PRenderGraphResources resources = new RenderGraphResources();
return RenderGraph<RenderPasses...>(resources, std::move(renderPasses)...);
}
private:
RenderGraphBuilder() = delete;
};
2021-05-06 17:02:10 +02:00
} // namespace Seele