FCT
载入中...
搜索中...
未找到
Context.cpp
浏览该文件的文档.
1//
2// Created by Administrator on 2025/3/16.
3//
4#include "../FCTAPI.h"
5#include "./Context.h"
6#include "RenderGraph.h"
7
8
9namespace FCT {
11 m_nextFrame = true;
12 }
13
15 m_currentFlush = true;
16 }
17
18
19 Image* Context::loadTexture(const std::string& filename)
20 {
21 auto data = m_imageLoader->load(filename);
22 SingleBufferImage* image = new SingleBufferImage(this);
23 image->width(data.width);
24 image->height(data.height);
25
26 bool isSRGB = true;
27
28
29 Format format;
30 switch (data.channels) {
31 case 1:
32 format = Format::R8_UNORM;
33 break;
34 case 2:
35 format = Format::R8G8_UNORM;
36 break;
37 case 3:
39 break;
40 case 4:
42 break;
43 default:
44 ferr << "Unsupported number of channels: " << data.channels << std::endl;
46 break;
47 }
48
49 image->format(format);
50 image->as(ImageUsage::Texture);
51 image->initData(data.data.data(), data.data.size());
52 image->create();
53 return image;
54 }
55
56
57
58
60 {
62 auto& m_submitTickers = m_flowControl->submitTickers();
63 auto& m_syncTickers = m_flowControl->syncTickers();
64
65 m_cmdGraph = nullptr;
66 m_renderGraph = nullptr;
67 m_resourceManager = nullptr;
68 m_compiler = nullptr;
69 m_ctxRunning = true;
70 //m_flushWnd = nullptr;
71 m_nextFrame = false;
72 m_currentFlush = true;
73 bool isInited = false;
74 m_submitThread = std::thread([this,&isInited]
75 {
76 m_submitThreadId = std::this_thread::get_id();
77 isInited = true;
79 });
80 FCT_WAIT_FOR(isInited);
83 m_frameIndex = 0;
87 m_submitTickers[SwapBufferSubmitTicker] = {
88 [this]()
89 {
90 std::this_thread::yield();
91 {
92 ScopeTimer waitGpuTimer("waitGpu");
93 m_cmdGraph->swapBuffer();
94 //swapBuffers();
95 }
96 },
97 {},
98 {}
99 };
100 m_submitTickers.update();
102 {
103 [this]()
104 {
105 for (auto& window : m_bindWindows)
106 {
107 window->swapchain()->sync();
108 }
109 },
110 {},
112 };
113 m_syncTickers[InnerSync::AdvanceFrameIndex] =
114 {
115 [this]()
116 {
119 },
120 {},
121 {}
122 };
123 m_syncTickers.update();
124 }
125
127 m_ctxRunning = false;
128 m_submitThread.join();
129 }
130
143
145 {
146 if (!modelMesh) {
147 return nullptr;
148 }
149
150 StaticMesh<uint32_t>* mesh = new StaticMesh<uint32_t>(this, layout);
151 VertexBuffer* vertexBuffer = mesh->getVertexBuffer();
152 vertexBuffer->resize(modelMesh->vertices.size());
153 for (uint32_t i = 0; i < modelMesh->vertices.size(); ++i) {
154 const auto& modelVertex = modelMesh->vertices[i];
155 Vertex vertex = (*vertexBuffer)[i];
156
157 for (size_t j = 0; j < layout.getElementCount(); ++j) {
158 const VertexElement& element = layout.getElement(j);
159 setVertexAttributeFromModel(vertex, j, element, modelVertex);
160 }
161 }
162
163 std::vector<uint32_t> indices = modelMesh->indices;
164 mesh->setIndices(indices);
165
166 mesh->create();
167
168 return mesh;
169 }
170
171 StaticMesh<uint32_t>* Context::loadMesh(const std::string& filename, const std::string& meshName,
172 const VertexLayout& layout)
173 {
174 auto md = m_modelLoader->loadModel(filename);
175 auto mMesh = md->findMesh(meshName);
176 return createMesh(mMesh,layout);
177 }
178}
#define FCT_WAIT_FOR(condition)
uint32_t m_maxFrameInFlight
RenderGraph * m_renderGraph
void submitThread()
RHI::DescriptorPool * m_descriptorPool
ShaderCompiler * m_compiler
ModelLoader * m_modelLoader
Image * loadTexture(const std::string &filename)
std::thread m_submitThread
ImageLoader * m_imageLoader
StaticMesh< uint32_t > * createMesh(const ModelMesh *modelMesh, const VertexLayout &layout)
uint32_t maxFrameInFlight() const
CommandBufferGraph * m_cmdGraph
ResourceManager * m_resourceManager
virtual void createPlatform()=0
Device * m_resourceDevice
void createCompiler()
FlowControl * m_flowControl
void advanceLogicFrame()
std::vector< Window * > m_bindWindows
ShaderGenerator * m_generator
void create(ContextCreateFlags flag=ContextCreateFlag::defaultConfig)
virtual ~Context()
Context(Runtime *runtime)
void advanceSubmitFrame()
size_t m_frameIndex
StaticMesh< uint32_t > * loadMesh(const std::string &filename, const std::string &meshName, const VertexLayout &layout)
std::thread::id m_submitThreadId
Format format() const
定义 Image.h:64
int height() const
定义 Image.h:76
int width() const
定义 Image.h:75
ModelLoader * createModelLoader()
ImageLoader * createImageLoader()
void initData(void *data, int size)
void as(ImageUsages usage) override
void setIndices(const std::vector< IndexType > &indices)
定义 Mesh.h:43
VertexBuffer * getVertexBuffer() const
定义 Mesh.h:84
void resize(size_t vertexCount)
constexpr size_t getElementCount() const noexcept
constexpr const VertexElement & getElement(size_t index) const noexcept
constexpr const char * CheckRecreateSwapchainSync
constexpr const char * AdvanceFrameIndex
std::ostream & ferr
constexpr const char * SwapBufferSubmitTicker
void setVertexAttributeFromModel(Vertex &vertex, size_t elementIndex, const VertexElement &element, const ModelVertex &modelVertex)
std::vector< uint32_t > indices
std::vector< ModelVertex > vertices