aboutsummaryrefslogtreecommitdiff
path: root/ProjectBrussel/Game/GameObject.hpp
diff options
context:
space:
mode:
authorrtk0c <[email protected]>2022-06-03 23:30:01 -0700
committerrtk0c <[email protected]>2022-06-03 23:30:01 -0700
commit791b3f354b378769bffe623b05f1305c91b77101 (patch)
tree5409b311e6232eb4a6d3f8259b780d76b8ee1c59 /ProjectBrussel/Game/GameObject.hpp
parent60ccc62f4934e44ad5b905fdbcf458302b8d8a09 (diff)
Changeset: 64 [WIP] Rename directoriesmaster-switch-to-build2
Diffstat (limited to 'ProjectBrussel/Game/GameObject.hpp')
-rw-r--r--ProjectBrussel/Game/GameObject.hpp102
1 files changed, 102 insertions, 0 deletions
diff --git a/ProjectBrussel/Game/GameObject.hpp b/ProjectBrussel/Game/GameObject.hpp
new file mode 100644
index 0000000..f975803
--- /dev/null
+++ b/ProjectBrussel/Game/GameObject.hpp
@@ -0,0 +1,102 @@
+#pragma once
+
+#include "EditorAttachment.hpp"
+#include "Material.hpp"
+#include "Renderer.hpp"
+#include "VertexIndex.hpp"
+
+#include <MacrosCodegen.hpp>
+#include <PodVector.hpp>
+
+#include <rapidjson/fwd.h>
+#include <glm/glm.hpp>
+#include <glm/gtc/quaternion.hpp>
+#include <span>
+#include <vector>
+
+namespace Tags {
+enum class GameObjectKind {
+ KD_Generic,
+ KD_Player,
+ KD_SimpleGeometry,
+ KD_Building,
+ KD_LevelWrapper,
+ KD_COUNT,
+};
+BRUSSEL_ENUM(GameObjectKind, ToString FromString ExcludeHeuristics);
+} // namespace Tags
+
+class GameWorld;
+class GameObject {
+public:
+ using Kind = Tags::GameObjectKind;
+ using enum Tags::GameObjectKind;
+
+private:
+ std::unique_ptr<EditorAttachment> mEditorAttachment;
+ GameWorld* mWorld;
+ GameObject* mParent;
+ PodVector<GameObject*> mChildren;
+ glm::quat mRot;
+ glm::vec3 mPos;
+ glm::vec3 mScale;
+ Kind mKind;
+
+protected:
+ bool mStopFreePropagation : 1 = false;
+
+public:
+ static void FreeRecursive(GameObject* object);
+
+ // TODO allow moving between worlds
+ GameObject(GameWorld* world);
+ GameObject(Kind kind, GameWorld* world);
+ virtual ~GameObject();
+
+ GameObject(const GameObject&) = delete;
+ GameObject& operator=(const GameObject&) = delete;
+ GameObject(GameObject&&) = default;
+ GameObject& operator=(GameObject&&) = default;
+
+ Kind GetKind() const;
+
+ GameWorld* GetWorld() const;
+ GameObject* GetParent() const;
+ const PodVector<GameObject*>& GetChildren() const;
+ void AddChild(GameObject* child);
+ GameObject* RemoveChild(int index);
+ GameObject* RemoveChild(GameObject* child);
+ void RemoveSelfFromParent();
+ PodVector<GameObject*> RemoveAllChildren();
+
+ EditorAttachment* GetEditorAttachment() const { return mEditorAttachment.get(); }
+ void SetEditorAttachment(EditorAttachment* attachment) { mEditorAttachment.reset(attachment); }
+
+ const glm::vec3& GetPos() const;
+ void SetPos(const glm::vec3& pos);
+
+ const glm::quat& GetRotation() const;
+ void SetRotation(const glm::quat& rotation);
+
+ const glm::vec3& GetScale() const;
+ void SetScale(const glm::vec3& scale);
+
+ // Visuals
+ virtual std::span<const RenderObject> GetRenderObjects() const;
+
+ // Lifetime hooks
+ virtual void OnInitialized();
+ virtual void Awaken();
+ virtual void Resleep();
+ virtual void Update();
+
+ static rapidjson::Value Serialize(GameObject* obj, rapidjson::Document& root);
+ static std::unique_ptr<GameObject> Deserialize(const rapidjson::Value& value, GameWorld* world);
+ virtual void ReadSaveFormat(const rapidjson::Value& value);
+ virtual void WriteSaveFormat(rapidjson::Value& value, rapidjson::Document& root);
+
+protected:
+ void SetParent(GameObject* parent);
+};
+
+#include <generated/GameObject.gh.inl>