Covellite++  Version: 2.3.1 Revision: ??? Platform: x64 Build: 21:47 08.04.2025
Кроссплатформенный фреймворк для разработки приложений на С++
Загрузка...
Поиск...
Не найдено
GraphicApi.cpp
1
2#include "stdafx.h"
3#include "GraphicApi.hpp"
4#include <Covellite/Api/Vertex.hpp>
5#include <Covellite/Api/Defines.hpp>
6#include <Covellite/Api/Component.inl>
7
8namespace covellite
9{
10
11namespace api
12{
13
14namespace renderer
15{
16
17GraphicApi::GraphicApi(void) :
18 m_StartProgram{ std::chrono::system_clock::now() },
19 m_CurrentFrameTime{ 0.0f }
20{
21 m_Creators =
22 {
23 { uT("Test"), [=](const ComponentPtr_t &)
24 { return [](void) {}; } },
25 { uT("Camera"), [=](const ComponentPtr_t & _pComponent)
26 { return CreateCamera(_pComponent); } },
27 { uT("BkSurface"), [=](const ComponentPtr_t & _pComponent)
28 { return CreateBkSurface(_pComponent); } },
29 { uT("State"), [=](const ComponentPtr_t & _pComponent)
30 { return CreateState(_pComponent); } },
31 { uT("Texture"), [=](const ComponentPtr_t & _pComponent)
32 { return CreateTexture(_pComponent); } },
33 { uT("TextureArray"), [=](const ComponentPtr_t & _pComponent)
34 { return CreateTextureArray(_pComponent); } },
35 { uT("Shader"), [=](const ComponentPtr_t & _pComponent)
36 { return CreateShader(_pComponent); } },
37 { uT("Buffer"), [=](const ComponentPtr_t & _pComponent)
38 { return CreateBuffer(_pComponent); } },
39 { uT("Transform"), [this](const ComponentPtr_t & _pComponent)
40 { return CreateTransform(_pComponent); } },
41 { uT("Present"), [=](const ComponentPtr_t & _pComponent)
42 { return CreatePresentBuffer(_pComponent); } },
43 { uT("Updater"), [this](const ComponentPtr_t & _pComponent)
44 { return CreateUpdater(_pComponent); } },
45 };
46}
47
48void GraphicApi::PresentFrame(void) /*override*/
49{
50 const ::std::chrono::duration<float> Time =
51 (std::chrono::system_clock::now() - m_StartProgram);
52 m_CurrentFrameTime = Time.count();
53 m_IsResizeWindow = false;
54}
55
56auto GraphicApi::GetCreators(void) const noexcept -> const Creators_t & /*final*/
57{
58 return m_Creators;
59}
60
61auto GraphicApi::CreateUpdater(const ComponentPtr_t & _pComponent) const -> Render_t
62{
63 using ::covellite::api::Updater_t;
64 using ::covellite::api::Component;
65
66 static const auto hFunctionName = Component::GetHash(uT("function"));
67 static const Updater_t Empty = [](const float) {};
68
69 // 11.10.2020: Вероятно, это уже неактуально после замены интерфейса:
70 // Если переданный функциональный объект захватить здесь, то оверхед
71 // будет существенно меньше (55kk против 12kk вызовов в секунду), но даже так
72 // оверхед достаточно мал, чтобы оказывать какое-либо существенное влияние
73 // на время рендеринга кадра (updater'ов в приципе не может быть много).
74
75 return [=](void)
76 {
77 // Создание здесь объекта, а не ссылки позволяет релизовать замену
78 // функции обратного вызова внутри самой функции обратного вызова.
79 const Updater_t Updater = (*_pComponent)[hFunctionName].Default(Empty);
80
81 Updater(m_CurrentFrameTime);
82 };
83}
84
85} // namespace renderer
86
87} // namespace api
88
89} // namespace covellite