Monad Engine da02fba2
> Undercity Codex_
Loading...
Searching...
No Matches
GameObject.h
Go to the documentation of this file.
1#pragma once
2#include "scene/Component.h"
3#include <string>
4#include <vector>
5#include <memory>
6#include <glm/vec3.hpp>
7#include <glm/gtc/quaternion.hpp>
8#include <glm/mat4x4.hpp>
9
10namespace eng
11{
12 class Scene;
13
15 {
16 public:
17 virtual ~GameObject() = default;
18 virtual void Init();
19 virtual void LoadProperties(const nlohmann::json& json);
20 virtual void Update(float deltaTime);
21 const std::string& GetName() const;
22 void SetName(const std::string& name);
24 bool SetParent(GameObject* parent);
25 Scene* GetScene();
26 bool IsAlive() const;
27 void MarkForDestroy();
28
29 void SetActive(bool active);
30 bool IsActive() const;
31
32 void AddComponent(Component* component);
33 template<typename T, typename = typename std::enable_if_t<std::is_base_of_v<Component, T>>>
35 {
36 size_t typeId = Component::StaticTypeId<T>();
37
38 for (auto& component : m_components)
39 {
40 if (component->GetTypeId() == typeId)
41 {
42 return static_cast<T*>(component.get());
43 }
44 }
45
46 return nullptr;
47 }
48
49 GameObject* FindChildByName(const std::string& name);
50
51 const glm::vec3& GetPosition() const;
52 glm::vec3 GetWorldPosition() const;
53 glm::vec2 GetPosition2D() const;
54 glm::vec2 GetWorldPosition2D() const;
55 void SetPosition(const glm::vec3& pos);
56 void SetWorldPosition(const glm::vec3& pos);
57 void SetPosition2D(const glm::vec2& pos);
58
59 const glm::quat& GetRotation() const;
60 glm::quat GetWorldRotation();
61 float GetRotation2D() const;
62 void SetRotation(const glm::quat& rot);
63 void SetWorldRotation(const glm::quat& rot);
64 void SetRotation2D(float rotation);
65
66 const glm::vec3& GetScale() const;
67 glm::vec2 GetScale2D() const;
68 void SetScale(const glm::vec3& scale);
69 void SetScale2D(const glm::vec2& scale);
70
71 glm::mat4 GetLocalTransform() const;
72 glm::mat4 GetLocalTransform2D() const;
73 glm::mat4 GetWorldTransform() const;
74 glm::mat4 GetWorldTransform2D() const;
75
76 static GameObject* LoadGLTF(const std::string& path, Scene* scene);
77
78 protected:
79 GameObject() = default;
80
81 protected:
82 std::string m_name;
83 GameObject* m_parent = nullptr;
84 Scene* m_scene = nullptr;
85 std::vector<std::unique_ptr<GameObject>> m_children;
86 std::vector<std::unique_ptr<Component>> m_components;
87 bool m_isAlive = true;
88 glm::vec3 m_position = glm::vec3(0.0f);
89 glm::quat m_rotation = glm::quat(1.0f, 0.0f, 0.0f, 0.0f);
90 glm::vec3 m_scale = glm::vec3(1.0f);
91 bool m_active = true;
92
93 friend class Scene;
94 };
95
97 {
98 public:
99 virtual ~ObjectCreatorBase() = default;
101 };
102
103 template<typename T>
105 {
106 public:
107 virtual GameObject* CreateGameObject() override
108 {
109 return new T();
110 }
111 };
112
114 {
115 public:
117 template<typename T>
118 void RegisterObject(const std::string& name)
119 {
120 m_creators.emplace(name, std::make_unique<ObjectCreator<T>>());
121 }
122
123 GameObject* CreateGameObject(const std::string& typeName);
124
125 private:
126 std::unordered_map<std::string, std::unique_ptr<ObjectCreatorBase>> m_creators;
127 };
128
129#define GAMEOBJECT(ObjectClass) \
130public: \
131 static void Register() { eng::GameObjectFactory::GetInstance().RegisterObject<ObjectClass>(std::string(#ObjectClass)); }
132}
void RegisterObject(const std::string &name)
Definition GameObject.h:118
static GameObjectFactory & GetInstance()
GameObject * CreateGameObject(const std::string &typeName)
virtual void Update(float deltaTime)
glm::quat GetWorldRotation()
std::string m_name
Definition GameObject.h:82
const glm::quat & GetRotation() const
static GameObject * LoadGLTF(const std::string &path, Scene *scene)
GameObject()=default
Scene * m_scene
Definition GameObject.h:84
glm::mat4 GetWorldTransform2D() const
const std::string & GetName() const
GameObject * FindChildByName(const std::string &name)
virtual ~GameObject()=default
glm::mat4 GetLocalTransform() const
void SetWorldRotation(const glm::quat &rot)
glm::vec3 GetWorldPosition() const
void MarkForDestroy()
void SetPosition2D(const glm::vec2 &pos)
std::vector< std::unique_ptr< Component > > m_components
Definition GameObject.h:86
Scene * GetScene()
glm::vec2 GetPosition2D() const
void SetRotation2D(float rotation)
float GetRotation2D() const
void SetPosition(const glm::vec3 &pos)
bool IsActive() const
void SetScale(const glm::vec3 &scale)
virtual void LoadProperties(const nlohmann::json &json)
bool SetParent(GameObject *parent)
void SetWorldPosition(const glm::vec3 &pos)
glm::mat4 GetLocalTransform2D() const
void AddComponent(Component *component)
bool IsAlive() const
const glm::vec3 & GetPosition() const
void SetActive(bool active)
void SetName(const std::string &name)
const glm::vec3 & GetScale() const
glm::vec3 m_scale
Definition GameObject.h:90
void SetScale2D(const glm::vec2 &scale)
glm::vec2 GetWorldPosition2D() const
GameObject * GetParent()
glm::vec2 GetScale2D() const
glm::mat4 GetWorldTransform() const
virtual void Init()
void SetRotation(const glm::quat &rot)
glm::vec3 m_position
Definition GameObject.h:88
GameObject * m_parent
Definition GameObject.h:83
glm::quat m_rotation
Definition GameObject.h:89
std::vector< std::unique_ptr< GameObject > > m_children
Definition GameObject.h:85
virtual ~ObjectCreatorBase()=default
virtual GameObject * CreateGameObject()=0
virtual GameObject * CreateGameObject() override
Definition GameObject.h:107