Covellite++  Version: 2.3.0 Revision: 2580 Platform: x64 Build: 15:23 16.10.2020
Кроссплатформенный фреймворк для разработки приложений на С++
GraphicApi.Constants.hpp
1 
2 #pragma once
3 #include <alicorn/cpp/math.hpp>
4 #include <alicorn/std/string.hpp>
5 #include <alicorn/std.fast/unordered-map.hpp>
6 #include "GraphicApi.hpp"
7 
8 namespace covellite
9 {
10 
11 namespace api
12 {
13 
14 namespace renderer
15 {
16 
17 class GraphicApi::Constants
18 {
19 public:
20  template<class>
21  class Data;
22 
23 private:
24  using CameraId_t = String_t;
25  template<class T>
26  using DataPtr_t = ::std::shared_ptr<Data<T>>;
27 
28 public:
29  template<class T>
30  T & Get(void);
31  template<class>
32  void Update(void);
33 
34 private:
35  template<class, template <class> class, class ... TArgs>
36  void Create(TArgs && ...);
37  template<class T>
38  Data<T> & GetBuffer(void);
39  friend GraphicApi;
40 
41 private:
42  ::alicorn::extension::std::fast::unordered_map<::std::size_t, ::covellite::Any_t> m_Data;
43  CameraId_t m_CurrentCameraId;
44 };
45 
46 template<class T>
47 class GraphicApi::Constants::Data
48 {
49 public:
50  T m_Data;
51 
52 public:
53  virtual void Update(void) const = 0;
54 
55 public:
56  Data(void) noexcept { memset(&m_Data, 0, sizeof(m_Data)); }
57  Data(const Data &) = delete;
58  Data(Data &&) = delete;
59  Data & operator= (const Data &) = delete;
60  Data & operator= (Data &&) = delete;
61  virtual ~Data(void) = default;
62 };
63 
64 template<class T, template <class> class TBuffer, class ... TArgs>
65 void GraphicApi::Constants::Create(TArgs && ... _Args)
66 {
67  static const auto hCode = typeid(T).hash_code();
68 
69  const DataPtr_t<T> pBuffer = ::std::make_shared<TBuffer<T>>(_Args ...);
70  m_Data[hCode] = pBuffer;
71 }
72 
73 template<class T>
74 inline T & GraphicApi::Constants::Get(void)
75 {
76  return GetBuffer<T>().m_Data;
77 }
78 
79 template<class T>
80 inline void GraphicApi::Constants::Update(void)
81 {
82  GetBuffer<T>().Update();
83 }
84 
85 template<class T>
86 auto GraphicApi::Constants::GetBuffer(void) -> Data<T> &
87 {
88  static const auto hCode = typeid(T).hash_code();
89 
90  const auto itConstant = m_Data.find(hCode);
91  if (itConstant == m_Data.end())
92  {
93  throw STD_EXCEPTION << "Unexpected type: " << typeid(T).name();
94  }
95 
96  return *::covellite::any_cast<DataPtr_t<T> &>(itConstant->second);
97 }
98 
99 template<template <class> class TBuffer, class ... TArgs>
100 void GraphicApi::MakeConstants(TArgs && ... _Args)
101 {
102  m_pConstants = ::std::make_shared<Constants>();
103  m_pConstants->Create<::Camera, TBuffer>(_Args ...);
104  m_pConstants->Create<::Object, TBuffer>(_Args ...);
105 }
106 
107 template<class TColor>
108 /*static*/ TColor GraphicApi::ARGBtoFloat4(uint32_t _HexColor)
109 {
110  return TColor
111  {
112  ((_HexColor & 0x00FF0000) >> 16) / 255.0f,
113  ((_HexColor & 0x0000FF00) >> 8) / 255.0f,
114  ((_HexColor & 0x000000FF) >> 0) / 255.0f,
115  ((_HexColor & 0xFF000000) >> 24) / 255.0f
116  };
117 }
118 
119 } // namespace renderer
120 
121 } // namespace api
122 
123 } // namespace covellite
covellite::api::renderer::GraphicApi::CapturingServiceComponent::Process
static void Process(const ComponentPtr_t &, const Handlers_t &)
Функция для последовательной обработки очереди вспомогательных компонентов.
Definition: GraphicApi.CapturingServiceComponent.cpp:92
covellite::api::renderer::GraphicApi::CapturingServiceComponent::Get
static Services_t Get(const ComponentPtr_t &, const Expected_t &)
Функция получения набора вспомогательных компонентов.
Definition: GraphicApi.CapturingServiceComponent.cpp:40