aboutsummaryrefslogtreecommitdiff
path: root/mwe/ecs-homemade/inc
diff options
context:
space:
mode:
authorMax-001 <80035972+Max-001@users.noreply.github.com>2024-09-25 21:08:54 +0200
committerMax-001 <80035972+Max-001@users.noreply.github.com>2024-09-25 21:08:54 +0200
commit5458abaca5f01a4d34bb55b1b44dc4fb4e9890be (patch)
treea23e35dc95c69aced7d4e16550a2b4fff8507a6c /mwe/ecs-homemade/inc
parent918392ec503a66e369fffa3a5a49c8afccf96a62 (diff)
Made a homemade ECS
Diffstat (limited to 'mwe/ecs-homemade/inc')
-rw-r--r--mwe/ecs-homemade/inc/ComponentManager.h37
-rw-r--r--mwe/ecs-homemade/inc/ComponentManager.hpp58
-rw-r--r--mwe/ecs-homemade/inc/Components.h22
-rw-r--r--mwe/ecs-homemade/inc/GameObjectMax.h20
-rw-r--r--mwe/ecs-homemade/inc/GameObjectMax.hpp6
5 files changed, 143 insertions, 0 deletions
diff --git a/mwe/ecs-homemade/inc/ComponentManager.h b/mwe/ecs-homemade/inc/ComponentManager.h
new file mode 100644
index 0000000..cfc5f20
--- /dev/null
+++ b/mwe/ecs-homemade/inc/ComponentManager.h
@@ -0,0 +1,37 @@
+#pragma once
+
+#include "Components.h"
+#include <cstdint>
+#include <unordered_map>
+#include <vector>
+#include <typeindex>
+#include <memory>
+#include <any>
+
+class ComponentManager {
+public:
+ static ComponentManager& GetInstance();
+
+ ComponentManager(const ComponentManager&) = delete;
+ ComponentManager(ComponentManager&&) = delete;
+ ComponentManager& operator=(const ComponentManager&) = delete;
+ ComponentManager& operator=(ComponentManager&&) = delete;
+
+ template <typename T>
+ void AddComponent(T* component, std::uint32_t id);
+ template <typename T>
+ T* GetComponent(std::uint32_t id);
+ template <typename T>
+ std::vector<std::uint32_t> GetAllComponentIDs();
+ template <typename T>
+ std::vector<T*> GetAllComponentPointer();
+
+private:
+ static ComponentManager mInstance;
+
+ ComponentManager();
+
+ std::unordered_map<std::type_index, std::vector<Component*>> mComponents; //TODO: Make this not only work with Component* OR add extra checks at templated methodes!!!
+};
+
+#include "ComponentManager.hpp"
diff --git a/mwe/ecs-homemade/inc/ComponentManager.hpp b/mwe/ecs-homemade/inc/ComponentManager.hpp
new file mode 100644
index 0000000..df8ea32
--- /dev/null
+++ b/mwe/ecs-homemade/inc/ComponentManager.hpp
@@ -0,0 +1,58 @@
+// AddComponent implementation
+template <typename T>
+void ComponentManager::AddComponent(T* component, std::uint32_t id) {
+ std::type_index type = typeid(T);
+ if (mComponents.find(type) == mComponents.end()) {
+ mComponents[type] = std::vector<Component*>();
+ }
+ // Resize the vector if the id is greater than current size
+ if (id >= mComponents[type].size()) {
+ mComponents[type].resize(id + 1, nullptr); // Initialize new slots to nullptr
+ }
+ mComponents[type][id] = component; // Store the raw pointer
+}
+
+// GetComponent implementation
+template <typename T>
+T* ComponentManager::GetComponent(std::uint32_t id) {
+ std::type_index type = typeid(T);
+ if (mComponents.find(type) != mComponents.end()) {
+ auto& componentArray = mComponents[type];
+ if (id < componentArray.size()) {
+ return static_cast<T*>(componentArray[id]); // Cast to the correct type
+ }
+ }
+ return nullptr; // Return nullptr if not found
+}
+
+// GetAllComponentIDs implementation
+template <typename T>
+std::vector<std::uint32_t> ComponentManager::GetAllComponentIDs() {
+ std::type_index type = typeid(T);
+ std::vector<std::uint32_t> ids;
+ if (mComponents.find(type) != mComponents.end()) {
+ const auto& componentArray = mComponents[type];
+ for (std::uint32_t id = 0; id < componentArray.size(); ++id) {
+ if (componentArray[id] != nullptr) {
+ ids.push_back(id); // Collect IDs of non-null components
+ }
+ }
+ }
+ return ids;
+}
+
+// GetAllComponentPointer implementation
+template <typename T>
+std::vector<T*> ComponentManager::GetAllComponentPointer() {
+ std::type_index type = typeid(T);
+ std::vector<T*> pointers;
+ if (mComponents.find(type) != mComponents.end()) {
+ const auto& componentArray = mComponents[type];
+ for (const auto& component : componentArray) {
+ if (component != nullptr) {
+ pointers.push_back(static_cast<T*>(component)); // Cast to the correct type
+ }
+ }
+ }
+ return pointers;
+}
diff --git a/mwe/ecs-homemade/inc/Components.h b/mwe/ecs-homemade/inc/Components.h
new file mode 100644
index 0000000..1ea8428
--- /dev/null
+++ b/mwe/ecs-homemade/inc/Components.h
@@ -0,0 +1,22 @@
+#pragma once
+
+class Component {
+public:
+ Component();
+
+ bool mActive;
+};
+
+class Sprite : public Component {
+public:
+ void Render();
+};
+
+class Rigidbody : public Component {
+public:
+ Rigidbody(int mass, int gravityScale, int bodyType);
+
+ int mMass;
+ int mGravityScale;
+ int mBodyType;
+};
diff --git a/mwe/ecs-homemade/inc/GameObjectMax.h b/mwe/ecs-homemade/inc/GameObjectMax.h
new file mode 100644
index 0000000..dbfe981
--- /dev/null
+++ b/mwe/ecs-homemade/inc/GameObjectMax.h
@@ -0,0 +1,20 @@
+#pragma once
+
+#include <cstdint>
+#include <string>
+
+class GameObject {
+public:
+ GameObject(std::uint32_t id, std::string name, std::string tag, int layer);
+
+ template <typename T>
+ void AddComponent(T* component);
+
+ std::uint32_t mId;
+ std::string mName;
+ std::string mTag;
+ bool mActive;
+ int mLayer;
+};
+
+#include "GameObjectMax.hpp"
diff --git a/mwe/ecs-homemade/inc/GameObjectMax.hpp b/mwe/ecs-homemade/inc/GameObjectMax.hpp
new file mode 100644
index 0000000..e1a49be
--- /dev/null
+++ b/mwe/ecs-homemade/inc/GameObjectMax.hpp
@@ -0,0 +1,6 @@
+#include "ComponentManager.h"
+
+template <typename T>
+void GameObject::AddComponent(T* component) {
+ ComponentManager::GetInstance().AddComponent(component, mId);
+}