Covellite++  Version: 2.3.0 Revision: 2580 Platform: x64 Build: 15:23 16.10.2020
Кроссплатформенный фреймворк для разработки приложений на С++
GameObject.hpp
1 
2 #pragma once
3 #include <glm/glm.force.hpp>
4 #include <alicorn/boost/filesystem.forward.hpp>
5 #include <Covellite/Api/Vertex.hpp>
6 #include "IGameObject.hpp"
7 
8 namespace basement
9 {
10 
11 namespace model
12 {
13 
14 class CubeCoords;
15 class IGameWorld;
16 
32 class GameObject :
33  public IGameObject
34 {
35 public:
36  using String_t = ::alicorn::extension::std::String;
37  using Index_t = int;
38  using IGameObjectPtr_t = ::std::shared_ptr<IGameObject>;
39  using Material_t = ::std::map<String_t, ::std::vector<Index_t>>;
40 
41 protected:
42  using Path_t = ::boost::filesystem::path;
44 
45 public:
46  // Интерфейс IGameObject:
47  size_t GetType(void) const final;
48 
49 public:
54  static IGameObjectPtr_t Create(const Support::Value);
55  static IGameObjectPtr_t Create(const Extra::Value);
56  static IGameObjectPtr_t Create(const Landscape::Value, const IGameWorld *);
57  static IGameObjectPtr_t Create(const Another::Value, const GameScenePtr_t &);
58 
59 public:
60  class Mesh
61  {
62  public:
63  class Vertex final
64  {
65  public:
66  using Hash_t = uint64_t;
67 
68  public:
69  Hash_t Hash = static_cast<Hash_t>(-1);
70  Vertex_t m_Vertex = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
71  };
72 
73  class Triangle_t final
74  {
75  public:
76  Vertex Vertexes[3];
77  String_t MaterialName = uT("Unknown");
78  };
79 
80  public:
81  virtual Object_t GetObject(const Any_t & = Any_t{}) const;
82 
83  protected:
84  using cbVertex_t = ::std::function<void(const Vertex &, const ::std::size_t)>;
85  void Add(const Triangle_t &, const cbVertex_t & = nullptr);
86  ::std::size_t GetAllVertexCount(void) const { return m_Vertexes.size(); }
87  void BuildBasementObject(const float);
88  static Point GetPoint(const float, const float = 0.5f);
89 
90  private:
91  ::std::map<Vertex::Hash_t, Index_t> m_iVertexes;
92 
93  protected:
94  const String_t m_MeshId;
95  ::std::vector<Vertex_t> m_Vertexes;
96  mutable Material_t m_MaterialIndices;
97 
98  public:
99  explicit Mesh(const ::std::vector<Triangle_t> & = {});
100  virtual ~Mesh(void) = default;
101  };
102 
103  class Texture final
104  {
105  public:
106  Object_t GetObject(void) const { return { m_pTexture }; }
107  float GetRatioXY(void) const { return m_RatioXY; }
108 
109  private:
110  Component_t::ComponentPtr_t m_pTexture;
111  float m_RatioXY;
112 
113  public:
114  explicit Texture(const Path_t &);
115  };
116 
117 protected:
118  static Object_t GetShaderObject(const bool = false);
119  size_t AddTexture(const Path_t &);
120  const Texture & GetTexture(const size_t) const;
121  template<class TMesh, class TData>
122  size_t AddMesh(const TData &) const;
123  template<class TMesh, class TData>
124  size_t AddMesh(const TData &, const float, const Rect &) const;
125  Mesh & GetMesh(const size_t) const;
126 
127 private:
128  const size_t m_Type;
129  mutable ::std::vector<::std::unique_ptr<Texture>> m_Textures;
130  mutable ::std::vector<::std::unique_ptr<Mesh>> m_Meshes;
131 
132 protected:
133  explicit GameObject(const size_t);
134 };
135 
136 template<class TMesh, class TData>
137 inline size_t GameObject::AddMesh(const TData & _Data) const
138 {
139  m_Meshes.push_back(::std::make_unique<TMesh>(_Data));
140  return m_Meshes.size() - 1;
141 }
142 
143 template<class TMesh, class TData>
144 inline size_t GameObject::AddMesh(
145  const TData & _Data,
146  const float _TextureRatioXY,
147  const Rect & _TextureCoord) const
148 {
149  m_Meshes.push_back(
150  ::std::make_unique<TMesh>(_Data, _TextureRatioXY, _TextureCoord));
151  return m_Meshes.size() - 1;
152 }
153 
154 } // namespace model
155 
156 } // namespace basement
basement::model::IGameObject
Класс входит в проект Example Интерфейсный класс игрового объекта.
Definition: IGameObject.hpp:27
basement::model::Camera
Класс входит в проект Example Класс главной камеры сцены.
Definition: Camera.hpp:28
basement::model::IGameObject::GetObject
virtual Objects_t GetObject(const Any_t &={}) const =0
Функция получения уникального набора компонентов игрового объекта.
covellite::api::Component::Make
static ComponentPtr_t Make(const SourceParams_t &)
Функция создания объектов компонентов.
Definition: Component.inl:29
basement::model::Skybox
Класс входит в проект Example Класс скайбокса.
Definition: Skybox.hpp:28
basement::model::GameObject::GetType
size_t GetType(void) const final
Функция получения типа игрового объекта.
Definition: GameObject.cpp:29
basement
Definition: Common.hpp:10
basement::model::GameObject::Create
static IGameObjectPtr_t Create(const Support::Value)
Функции создания объекта игрового объекта указанного типа.
Definition: GameObject.cpp:34
basement::model::Water
Класс входит в проект Example Класс объекта отрисовки воды.
Definition: Water.hpp:28
basement::model::IGameWorld
Класс входит в проект Example Интерфейсный класс игрового мира.
Definition: IGameWorld.hpp:34
covellite::api::Vertex
Класс входит в проект Covellite.Api Класс формата вертексного буфера.
Definition: Vertex.hpp:34
basement::model::GameObject
Класс входит в проект Example Общий базовый класс игрового объекта.
Definition: GameObject.hpp:34