-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathPipeline.h
136 lines (113 loc) · 4.29 KB
/
Pipeline.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#pragma once
#include "renderer.h"
#include "Scene.h"
#include "Quad.h"
#include "Setting.h"
#define VIEW_METHOD(x)\
void add##x(const std::string& name, Renderer::x::Ptr ptr){mPipeline->add##x(name, ptr);}\
Renderer::x::Ptr get##x(const std::string& name){ return mPipeline->get##x(name);}
#define PIPELINE_GET_METHOD(x, Space)\
Space::x::Ptr get##x(){return mPipeline->get##x();};
class Pipeline:public Setting::Modifier
{
friend class Stage;
public:
class Stage: public Setting::Modifier
{
friend class Pipeline;
public:
using Ptr = std::shared_ptr<Stage>;
public:
Stage(Renderer::Ptr r, Scene::Ptr s, Quad::Ptr q,Setting::Ptr set, Pipeline* p);
virtual ~Stage();
void update(Renderer::Texture2D::Ptr rt);
virtual void render(Renderer::Texture2D::Ptr rt) = 0;
virtual void onChanged(const std::string& key, const nlohmann::json::value_type& value)override {};
virtual void init() {};
Renderer::Ptr getRenderer()const { return mRenderer; }
Scene::Ptr getScene()const { return mScene; }
Quad::Ptr getQuad()const { return mQuad; }
virtual const std::string& getName() const{ return mName; }
void showCost();
VIEW_METHOD(ShaderResource);
VIEW_METHOD(RenderTarget);
VIEW_METHOD(DepthStencil);
VIEW_METHOD(UnorderedAccess);
VIEW_METHOD(Buffer);
VIEW_METHOD(Texture2D);
PIPELINE_GET_METHOD(Camera, Scene);
protected:
std::string mName = "Default Stage";
private:
Quad::Ptr mQuad;
Renderer::Ptr mRenderer;
Scene::Ptr mScene;
Pipeline* mPipeline;
Renderer::Profile::Ptr mProfile;
size_t mCachedTimes = 0;
size_t mCachedNumFrames = 0;
size_t mFPS = 0;
};
class Anonymous : public Stage
{
public:
using DrawCall = std::function<void(Renderer::Texture2D::Ptr)>;
public:
Anonymous(Renderer::Ptr r, Scene::Ptr s,Quad::Ptr q,Setting::Ptr st, Pipeline* p, const std::string& name, DrawCall drawcall) :Stage(r, s,q,st, p),mDrawCall(drawcall)
{
mName = name;
}
void render(Renderer::Texture2D::Ptr rt) override final
{
mDrawCall(rt);
}
private:
DrawCall mDrawCall;
};
public:
Pipeline(Renderer::Ptr r, Scene::Ptr s);
template<class T, class ... Args>
void pushStage(Args ... args)
{
auto ptr = new T(mRenderer, mScene, mQuad,mSetting,this);
ptr->init( args...);
mStages.emplace_back(Stage::Ptr(ptr));
}
void pushStage(const std::string& name, Anonymous::DrawCall dc);
void render();
void setFrameBuffer(Renderer::Texture2D::Ptr rt);
Setting::Ptr getSetting()const { return mSetting; }
void onChanged(const std::string& key, const nlohmann::json::value_type& value) override {};
void addShaderResource(const std::string& name, Renderer::ShaderResource::Ptr ptr);
void addRenderTarget(const std::string& name, Renderer::RenderTarget::Ptr ptr);
void addDepthStencil(const std::string& name, Renderer::DepthStencil::Ptr ptr);
void addUnorderedAccess(const std::string& name, Renderer::UnorderedAccess::Ptr ptr);
void addBuffer(const std::string& name, Renderer::Buffer::Ptr ptr);
void addTexture2D(const std::string& name, Renderer::Texture2D::Ptr ptr);
Renderer::ShaderResource::Ptr getShaderResource(const std::string& name);
Renderer::RenderTarget::Ptr getRenderTarget(const std::string& name);
Renderer::DepthStencil::Ptr getDepthStencil(const std::string& name);
Renderer::UnorderedAccess::Ptr getUnorderedAccess(const std::string& name);
Renderer::Buffer::Ptr getBuffer(const std::string& name);
Renderer::Texture2D::Ptr getTexture2D(const std::string& name);
void setCamera(Scene::Camera::Ptr cam) { mMainCamera = cam; }
Scene::Camera::Ptr getCamera() { return mMainCamera; }
private:
static void report(const std::string& msg);
private:
Scene::Camera::Ptr mMainCamera;
Renderer::Ptr mRenderer;
Scene::Ptr mScene;
Quad::Ptr mQuad;
std::vector<Stage::Ptr> mStages;
Renderer::Texture2D::Ptr mFrameBuffer;
Setting::Ptr mSetting;
Renderer::Profile::Ptr mProfile;
std::unordered_map<std::string, Renderer::ShaderResource::Ptr> mShaderResources;
std::unordered_map<std::string, Renderer::RenderTarget::Ptr> mRenderTargets;
std::unordered_map<std::string, Renderer::DepthStencil::Ptr> mDepthStencils;
std::unordered_map<std::string, Renderer::UnorderedAccess::Ptr> mUnorderedAccesses;
std::unordered_map<std::string, Renderer::Buffer::Ptr> mBuffers;
std::unordered_map<std::string, Renderer::Texture2D::Ptr> mTexture2Ds;
bool mDoProfile = false;
};