FCT
载入中...
搜索中...
未找到
VertexContext.h
浏览该文件的文档.
1#include "./VertexPath.h"
2namespace FCT
3{
11 struct VertexScreen {
12 public:
13 VertexScreen(std::vector<VertexScreenInfo>& infos, size_t infoIndex)
14 : m_infos(infos), m_infoIndex(infoIndex)
15 {
16 }
17
18 void pushPath(VertexPath* path)
19 {
20 path->addRef();
21 m_paths.push_back(path);
22 }
23
25 {
26 for (auto& path : m_paths) {
27 path->release();
28 }
29 m_paths.clear();
30 }
31
33 {
34 m_infos[m_infoIndex].XDir = Vec4(dir);
35 return *this;
36 }
37
39 {
40 m_infos[m_infoIndex].YDir = Vec4(dir);
41 return *this;
42 }
43
45 {
46 m_infos[m_infoIndex].origin = Vec4(origin);
47 return *this;
48 }
49
51 {
52 m_infos[m_infoIndex].originVertexCoord = Vec4(origin);
53 return *this;
54 }
55
57 {
58 m_infos[m_infoIndex].VertexCoordSize = Vec4(size);
59 return *this;
60 }
61
63 {
64 return m_infos[m_infoIndex];
65 }
66
67 const std::vector<VertexPath*>& getPaths() const
68 {
69 return m_paths;
70 }
71 protected:
72 std::vector<VertexScreenInfo>& m_infos;
74 std::vector<VertexPath*> m_paths;
75 };
76 using VertexSubmitJobCallBack = std::function<void()>;
78 {
79 protected:
81 public:
83 {
84 m_callBack = callBack;
85 }
86 virtual void submit(RHI::CommandBuffer* cmdBuffers) override
87 {
88 m_callBack();
89 }
90 };
92 {
93 protected:
95 std::string m_passName;
96 std::pair<ConstLayout,ConstElement> m_viewMatrix;
97 std::pair<ConstLayout,ConstElement> m_projectionMatrix;
98 //PassResource* m_passResource;
99 std::vector<PassResource*> m_passResources;
100 std::vector<VertexScreen> m_screens;
101 std::map<std::string, uint32_t> m_screenIndexMap;
102 std::vector<VertexScreenInfo> m_infos;
103 //screen 不超过 4000 / 5 = 800个
115 static constexpr const char* VertexCommandBufferNameInShder = "VertexCommandBuffer";
116 static constexpr const char* ScreenInfoNameInShder = "ScreenInfo";
123 std::string m_uploadPassName;
126 std::vector<float> m_commandBuffer;
127 public:
129 {
130 m_targetIndex = 0;
131 for (int i = 0;i < m_ctx->maxFrameInFlight();i++)
132 {
133 m_passResources.push_back(m_ctx->createResource<PassResource>());
134 }
135 /*
136 m_passResource = m_ctx->createPassResource();
137 m_passResource->bind(wnd);
138 */
139 }
140
141 void updataCommandInfo();
142 void submitPath();
143 void addRectangle(uint32_t screenId, uint32_t commandOffset, uint32_t commandSize, const Vec4& bounds);
144 void create();
145
146 void addScreen(const std::string& name);
147 VertexScreen& setScreen(const std::string& name);
148 void mvpUniformLayout(ConstLayout layout);;
149
150 void attachPass(std::string passName,std::string uploadPassName = "")
151 {
152 m_passName = passName;
153 if (uploadPassName.empty())
154 {
155 uploadPassName = passName + "_VertexUpload";
156 }
157 m_uploadPassName = uploadPassName;
158
159 OldPass* uploadPass = new TraditionRenderPass(m_ctx);
160 /*
161 m_ctx->addPass(uploadPassName, uploadPass);
162 uploadPass->release();
163
164 m_ctx->bindOutputImage(uploadPassName, VertexCommandBufferNameInShder, 0);
165 m_ctx->bindOutputImage(uploadPassName, ScreenInfoNameInShder, 1);
166
167 m_ctx->bindTextureImage(passName, VertexCommandBufferNameInShder,4096,1,Samples::sample_1);
168 m_ctx->bindTextureImage(passName, ScreenInfoNameInShder,4000,1,Samples::sample_1);
169*/
170 create();
171 }
173 void generatePixelShader();
174
175 void addPath(std::string screenName,VertexPath* path)
176 {
177 VertexScreen& screen = setScreen(screenName);
178 screen.pushPath(path);
179 }
180 void clearPath(std::string screenName)
181 {
182 VertexScreen& screen = setScreen(screenName);
183 screen.clearPaths();
184 }
186 {
187 for (auto& resource : m_passResources)
188 {
189 resource->addConstBuffer(constBuffer);
190 }
191 //m_passResource->addConstBuffer(constBuffer);
192 }
194 {
195 /*
196 auto screenInfoImage = m_ctx->getResourceImage(ScreenInfoNameInShder);
197 */
198 uint32_t totalElements = m_infos.size() * 5;
199
200 std::vector<float> screenData;
201 screenData.reserve(totalElements * 4);
202
203 for (const auto& info : m_infos) {
204 screenData.push_back(info.origin.x);
205 screenData.push_back(info.origin.y);
206 screenData.push_back(info.origin.z);
207 screenData.push_back(info.origin.w);
208
209 screenData.push_back(info.XDir.x);
210 screenData.push_back(info.XDir.y);
211 screenData.push_back(info.XDir.z);
212 screenData.push_back(info.XDir.w);
213
214 screenData.push_back(info.YDir.x);
215 screenData.push_back(info.YDir.y);
216 screenData.push_back(info.YDir.z);
217 screenData.push_back(info.YDir.w);
218
219 screenData.push_back(info.originVertexCoord.x);
220 screenData.push_back(info.originVertexCoord.y);
221 screenData.push_back(info.originVertexCoord.z);
222 screenData.push_back(info.originVertexCoord.w);
223
224 screenData.push_back(info.VertexCoordSize.x);
225 screenData.push_back(info.VertexCoordSize.y);
226 screenData.push_back(info.VertexCoordSize.z);
227 screenData.push_back(info.VertexCoordSize.w);
228 }
229
230 /*
231 if (screenInfoImage->width() * screenInfoImage->height() >= totalElements) {
232 auto res = screenInfoImage->updateToCurrent(screenData.data(), screenData.size() * sizeof(float));
233 auto job = new VertexSubmitJob([res]()
234 {
235 ScopeTimer waitForUploadToGpuTimer("waitForUploadToGpu");
236 res->waitFor();
237 });
238 m_ctx->submit(job,m_uploadPassName);
239 job->release();
240 } else {
241 ferr << "目前仅支持 4000 / 5 = 800 个screen" << std::endl;
242 }
243 */
244 }
245
246 void submit()
247 {
248 /*
249 updataScreenInfo();
250 submitPath();
251
252 updataCommandInfo();
253 auto job = new TraditionRenderJob();
254 job->addMesh(m_mesh)
255 .setPassResource(m_passResources[m_ctx->currentFrameIndex()])
256 //.setPassResource(m_passResource)
257 .setPipelineState(m_pso);
258
259 m_ctx->submit(job, m_passName);
260 job->release();
261 */
262 }
263 };
264
265 /*
266 *
267 *attachPass
268 * |create
269 * |generateVertexShader
270 * |generatePixelShader
271 *setScreen
272 *addPath
273 *submit
274 * |updataScreenInfo
275 * |submitPath
276 * |copyToCommandQueue
277 * |addRectangle
278 * |updataCommandInfo
279 *
280 *
281 */
282}
void mvpUniformLayout(ConstLayout layout)
std::map< std::string, uint32_t > m_screenIndexMap
std::vector< PassResource * > m_passResources
static constexpr PixelLayout pixelLayout
std::pair< ConstLayout, ConstElement > m_projectionMatrix
void addConstBuffer(RHI::ConstBuffer *constBuffer)
void addRectangle(uint32_t screenId, uint32_t commandOffset, uint32_t commandSize, const Vec4 &bounds)
static constexpr const char * VertexCommandBufferNameInShder
void addPath(std::string screenName, VertexPath *path)
TraditionPipelineState * m_pso
std::vector< VertexScreen > m_screens
static constexpr const char * ScreenInfoNameInShder
void clearPath(std::string screenName)
std::vector< VertexScreenInfo > m_infos
void attachPass(std::string passName, std::string uploadPassName="")
static constexpr VertexLayout vertexLayout
static constexpr ResourceLayout resourceLayout
VertexScreen & setScreen(const std::string &name)
DynamicMesh< uint32_t > * m_mesh
std::vector< float > m_commandBuffer
std::pair< ConstLayout, ConstElement > m_viewMatrix
void addScreen(const std::string &name)
VertexSubmitJob(VertexSubmitJobCallBack callBack)
VertexSubmitJobCallBack m_callBack
virtual void submit(RHI::CommandBuffer *cmdBuffers) override
std::function< void()> VertexSubmitJobCallBack
const std::vector< VertexPath * > & getPaths() const
VertexScreen & setVertexCoordSize(Vec2 size)
std::vector< VertexPath * > m_paths
const VertexScreenInfo & getInfo() const
VertexScreen & setOrigin(Vec3 origin)
std::vector< VertexScreenInfo > & m_infos
VertexScreen & setOriginVertexCoord(Vec2 origin)
void pushPath(VertexPath *path)
VertexScreen(std::vector< VertexScreenInfo > &infos, size_t infoIndex)
VertexScreen & setX(Vec3 dir)
VertexScreen & setY(Vec3 dir)