Covellite++  Version: 2.3.0 Revision: 2580 Platform: x64 Build: 15:23 16.10.2020
Кроссплатформенный фреймворк для разработки приложений на С++
Animated.hpp
1 
2 #pragma once
3 #include "Animation.hpp"
4 #include "GameObject.hpp"
5 #include "CubeCoords.hpp"
6 #include "Defines.hpp"
7 
8 namespace basement
9 {
10 
11 namespace model
12 {
13 
29 class Animated final :
30  public GameObject
31 {
32  using ComponentPtr_t = ::covellite::api::Component::ComponentPtr_t;
33  using cbMaterial_t =
34  ::std::function<Object_t(const Material_t::value_type &)>;
35  class Animations;
36 
37  class Value_t
38  {
39  public:
40  cbMaterial_t Material;
41  CubeCoords Coords;
42  ComponentPtr_t pAnimation;
43  };
44 
45 public:
46  Objects_t GetObject(const Any_t &) const override;
47 
48 private:
49  class Animation final
50  {
51  public:
52  Object_t GetObject(void) const;
53 
54  private:
55  float m_TicksPerSecond = 1.0f;
56  animation::Frames_t m_RawFrames;
57 
58  public:
59  explicit Animation(const Path_t &);
60  };
61 
62  class Mesh final :
63  public GameObject::Mesh
64  {
66  using Bone_t = animation::Bone;
67  using Skin_t = animation::Skin_t;
68  using WeightBones_t = ::std::vector<::std::pair<Bone_t::Index_t, float>>;
69  using BoneTransforms_t = ::std::map<String_t, ::glm::mat4>;
70 
71  class TriangleWeightBones final
72  {
73  public:
74  WeightBones_t WeightBones[3];
75  };
76 
77  class Skeleton final
78  {
79  public:
80  inline void Add(
81  const ::std::string & _BoneName,
82  const ::std::string & _ParentBoneName,
83  const ::glm::mat4 & _GlobalTransformation,
84  const ::glm::mat4 & _LocalTransformation)
85  {
86  m_Bones.push_back(
87  {
88  _BoneName,
89  GetBoneIndex(_ParentBoneName),
90  _GlobalTransformation,
91  _LocalTransformation
92  });
93  }
94 
95  inline const Skeleton_t & GetBones(void) const { return m_Bones; }
96 
97  inline Bone_t::Index_t GetBoneIndex(const ::std::string & _Name) const
98  {
99  for (::std::size_t i = 0; i < m_Bones.size(); i++)
100  {
101  if (m_Bones[i].Name == _Name) return i;
102  }
103 
104  return Bone_t::iNonexistent;
105  };
106 
107  private:
108  Skeleton_t m_Bones;
109  };
110 
111  public:
112  Object_t GetObject(const Any_t &) const override;
113 
114  private:
115  Object_t GetHoldInHandObject(const String_t &) const;
116  void Add(const Triangle_t &, const TriangleWeightBones &);
117  void AddSkin(const Vertex &, const ::std::size_t, const WeightBones_t &);
118  ::std::size_t GetSkinVertexCount(void) const { return m_SkinVertexes.size(); }
119 
120  private:
121  mutable ::std::shared_ptr<Animations> m_pAnimations;
122  Skeleton m_Skeleton;
123  Skin_t m_SkinVertexes;
124  mutable Component_t::ComponentPtr_t m_pSkinData;
125  mutable Component_t::ComponentPtr_t m_pTransformBones;
126 
127  public:
128  explicit Mesh(const Path_t &);
129  };
130 
131 private:
132  static Object_t GetCameraObject(const GameScenePtr_t &);
133  static Object_t GetLightsObject(void);
134  static Object_t GetPresentObject(const CubeCoords &,
135  const ::std::vector<Index_t> &);
136 
137 private:
138  const GameScenePtr_t m_pGameScene;
139  Object_t m_Object;
140  mutable ::std::map<::std::string, ::std::size_t> m_Textures;
141 
142 private:
143  explicit Animated(const GameScenePtr_t &);
144  friend GameObject;
145 };
146 
147 } // namespace model
148 
149 } // namespace basement
basement::model::Animation
Класс входит в проект Example Тип для доступа к данным одной анимации.
Definition: Animation.hpp:159
basement::model::animation::Bone
Класс входит в проект Example Класс информации об одной кости скелета анимированной модели.
Definition: Animation.hpp:34
basement::model::animation::Skeleton_t
::std::vector< Bone > Skeleton_t
Класс входит в проект Example Тип данных скелета.
Definition: Animation.hpp:64
covellite::api::Component::Make
static ComponentPtr_t Make(const SourceParams_t &)
Функция создания объектов компонентов.
Definition: Component.inl:29
basement::model::animation::Frames_t
::std::vector<::std::pair< float, ::alicorn::extension::std::fast::unordered_map<::std::string, Mat4 > >> Frames_t
Класс входит в проект Example Тип данных набора кадров одной анимации.
Definition: Animation.hpp:139
basement::model::Animated::GetObject
Objects_t GetObject(const Any_t &) const override
Функция получения уникального набора компонентов игрового объекта.
Definition: Animated.cpp:67
basement
Definition: Common.hpp:10
basement::model::CubeCoords
Класс входит в проект Example Класс манипуляции кубическими координатами.
Definition: CubeCoords.hpp:26
covellite::api::Vertex
Класс входит в проект Covellite.Api Класс формата вертексного буфера.
Definition: Vertex.hpp:34
basement::model::animation::Skin_t
::std::vector< SkinVertex > Skin_t
Класс входит в проект Example Тип данных набора вершин анимированной модели.
Definition: Animation.hpp:110
basement::model::GameObject
Класс входит в проект Example Общий базовый класс игрового объекта.
Definition: GameObject.hpp:34
basement::model::Animated
Класс входит в проект Example Класс рендеринга анимированного объекта.
Definition: Animated.hpp:31