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:
|
|
|
|
|
RenderGraph(PRenderGraphResources resources, This&& pass, Rest&&... rest)
|
|
|
|
|
: 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>
|
|
|
|
|
static RenderGraph<RenderPasses...> build(RenderPasses&&... renderPasses)
|
|
|
|
|
{
|
|
|
|
|
PRenderGraphResources resources = new RenderGraphResources();
|
|
|
|
|
return RenderGraph<RenderPasses...>(resources, std::move(renderPasses)...);
|
|
|
|
|
}
|
|
|
|
|
private:
|
|
|
|
|
RenderGraphBuilder() = delete;
|
|
|
|
|
};
|
|
|
|
|
|
2021-05-06 17:02:10 +02:00
|
|
|
} // namespace Seele
|