Covellite++  Version: 2.3.0 Revision: ??? Platform: x64 Build: 23:13 04.01.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("Shader"), [=](const ComponentPtr_t & _pComponent)
34 { return CreateShader(_pComponent); } },
35 { uT("Buffer"), [=](const ComponentPtr_t & _pComponent)
36 { return CreateBuffer(_pComponent); } },
37 { uT("Transform"), [this](const ComponentPtr_t & _pComponent)
38 { return CreateTransform(_pComponent); } },
39 { uT("Present"), [=](const ComponentPtr_t & _pComponent)
40 { return CreatePresentBuffer(_pComponent); } },
41 { uT("Updater"), [this](const ComponentPtr_t & _pComponent)
42 { return CreateUpdater(_pComponent); } },
43 };
44}
45
46void GraphicApi::PresentFrame(void) /*override*/
47{
48 const ::std::chrono::duration<float> Time =
49 (std::chrono::system_clock::now() - m_StartProgram);
50 m_CurrentFrameTime = Time.count();
51 m_IsResizeWindow = false;
52}
53
54auto GraphicApi::GetCreators(void) const noexcept -> const Creators_t & /*final*/
55{
56 return m_Creators;
57}
58
59auto GraphicApi::CreateUpdater(const ComponentPtr_t & _pComponent) const -> Render_t
60{
61 using ::covellite::api::Updater_t;
62 using ::covellite::api::Component;
63
64 static const auto hFunctionName = Component::GetHash(uT("function"));
65 static const Updater_t Empty = [](const float) {};
66
67 // 11.10.2020: Вероятно, это уже неактуально после замены интерфейса:
68 // Если переданный функциональный объект захватить здесь, то оверхед
69 // будет существенно меньше (55kk против 12kk вызовов в секунду), но даже так
70 // оверхед достаточно мал, чтобы оказывать какое-либо существенное влияние
71 // на время рендеринга кадра (updater'ов в приципе не может быть много).
72
73 return [=](void)
74 {
75 // Создание здесь объекта, а не ссылки позволяет релизовать замену
76 // функции обратного вызова внутри самой функции обратного вызова.
77 const Updater_t Updater = (*_pComponent)[hFunctionName].Default(Empty);
78
79 Updater(m_CurrentFrameTime);
80 };
81}
82
83} // namespace renderer
84
85} // namespace api
86
87} // namespace covellite