diff options
author | Max-001 <80035972+Max-001@users.noreply.github.com> | 2024-10-05 11:05:59 +0200 |
---|---|---|
committer | Max-001 <80035972+Max-001@users.noreply.github.com> | 2024-10-05 11:05:59 +0200 |
commit | c39adf3040c3f2f7cfcab5ce5b7e39b815e8131d (patch) | |
tree | 3dc49555635077ef8e59270b886866f4a2dce24c /mwe/ecs-homemade/inc | |
parent | 03b25facdf35117eb9f56c7a2edbec5b34b90203 (diff) |
Setup ecs-memory-efficient
Diffstat (limited to 'mwe/ecs-homemade/inc')
-rw-r--r-- | mwe/ecs-homemade/inc/ComponentManager.h | 48 | ||||
-rw-r--r-- | mwe/ecs-homemade/inc/ComponentManager.hpp | 88 | ||||
-rw-r--r-- | mwe/ecs-homemade/inc/Components.h | 29 | ||||
-rw-r--r-- | mwe/ecs-homemade/inc/GameObjectMax.h | 20 | ||||
-rw-r--r-- | mwe/ecs-homemade/inc/GameObjectMax.hpp | 6 |
5 files changed, 0 insertions, 191 deletions
diff --git a/mwe/ecs-homemade/inc/ComponentManager.h b/mwe/ecs-homemade/inc/ComponentManager.h deleted file mode 100644 index 893aa56..0000000 --- a/mwe/ecs-homemade/inc/ComponentManager.h +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once - -#include "Components.h" -#include <cstdint> -#include <unordered_map> -#include <vector> -#include <typeindex> -#include <memory> -#include <utility> - -class ComponentManager { -public: - static ComponentManager& GetInstance(); //Singleton - - ComponentManager(const ComponentManager&) = delete; //Singleton - ComponentManager(ComponentManager&&) = delete; //Singleton - ComponentManager& operator=(const ComponentManager&) = delete; //Singleton - ComponentManager& operator=(ComponentManager&&) = delete; //Singleton - - template <typename T, typename... Args> - void AddComponent(std::uint32_t id, Args&&... args); //Add a component of a specific type - template <typename T> - void DeleteComponentsById(std::uint32_t id); //Deletes all components of a specific type and id - template <typename T> - void DeleteComponents(); //Deletes all components of a specific type - void DeleteAllComponentsOfId(std::uint32_t id); //Deletes all components of a specific id - void DeleteAllComponents(); //Deletes all components - - template <typename T> - std::vector<std::reference_wrapper<T>> GetComponentsByID(std::uint32_t id) const; //Get a vector<> of all components at specific type and id - template <typename T> - std::vector<std::pair<std::reference_wrapper<T>, std::uint32_t>> GetComponentsByType() const; //Get a vector<> of all components of a specific type - -private: - static ComponentManager mInstance; //Singleton - - ComponentManager(); //Singleton - - /* - * The std::unordered_map<std::type_index, std::vector<std::vector<std::unique_ptr<Component>>>> below might seem a bit strange, let me explain this structure: - * The std::unordered_map<> has a key and value. The key is a std::type_index and the value is a std::vector. So, a new std::vector will be created for each new std::type_index. - * The first std::vector<> stores another vector<>. This first vector<> is to bind the entity's id to a component. - * The second std::vector<> stores unique_ptrs. Each component can be gathered via an unique_ptr. This second vector<> allows multiple components of the same std::type_index for one entity (id). - */ - std::unordered_map<std::type_index, std::vector<std::vector<std::unique_ptr<Component>>>> mComponents; -}; - -#include "ComponentManager.hpp" diff --git a/mwe/ecs-homemade/inc/ComponentManager.hpp b/mwe/ecs-homemade/inc/ComponentManager.hpp deleted file mode 100644 index 53dfddd..0000000 --- a/mwe/ecs-homemade/inc/ComponentManager.hpp +++ /dev/null @@ -1,88 +0,0 @@ - -template <typename T, typename... Args> -void ComponentManager::AddComponent(std::uint32_t id, Args&&... args) { - std::type_index type = typeid(T); //Determine the type of T (this is used as the key of the unordered_map<>) - - if (mComponents.find(type) == mComponents.end()) { //Check if this component type is already in the unordered_map<> - mComponents[type] = std::vector<std::vector<std::unique_ptr<Component>>>(); //If not, create a new (empty) vector<> of vector<unique_ptr<Component>> - } - - if (id >= mComponents[type].size()) { //Resize the vector<> if the id is greater than the current size - mComponents[type].resize(id + 1); //Initialize new slots to nullptr (resize does automatically init to nullptr) - } - - mComponents[type][id].push_back(std::make_unique<T>(std::forward<Args>(args)...)); //Create a new component of type T using perfect forwarding and store its unique_ptr in the vector<> -} - -template <typename T> -void ComponentManager::DeleteComponentsById(std::uint32_t id) { - std::type_index type = typeid(T); //Determine the type of T (this is used as the key of the unordered_map<>) - - if (mComponents.find(type) != mComponents.end()) { //Find the type (in the unordered_map<>) - std::vector<std::vector<std::unique_ptr<Component>>>& componentArray = mComponents[type]; //Get the correct vector<> - - if (id < componentArray.size()) { //Make sure that the id (that we are looking for) is within the boundaries of the vector<> - componentArray[id].clear(); //Clear the whole vector<> of this specific type and id - } - } -} - -template <typename T> -void ComponentManager::DeleteComponents() { - std::type_index type = typeid(T); //Determine the type of T (this is used as the key of the unordered_map<>) - - if (mComponents.find(type) != mComponents.end()) { //Find the type (in the unordered_map<>) - mComponents[type].clear(); //Clear the whole vector<> of this specific type - } -} - -template <typename T> -std::vector<std::reference_wrapper<T>> ComponentManager::GetComponentsByID(std::uint32_t id) const { - std::type_index type = typeid(T); //Determine the type of T (this is used as the key of the unordered_map<>) - - std::vector<std::reference_wrapper<T>> componentVector; //Create an empty vector<> - - if (mComponents.find(type) != mComponents.end()) { //Find the type (in the unordered_map<>) - - const std::vector<std::vector<std::unique_ptr<Component>>>& componentArray = mComponents.at(type); //Get the correct vector<> - - if (id < componentArray.size()) { //Make sure that the id (that we are looking for) is within the boundaries of the vector<> - for (const std::unique_ptr<Component>& componentPtr : componentArray[id]) { //Loop trough the whole vector<> - T* castedComponent = static_cast<T*>(componentPtr.get()); //Cast the unique_ptr to a raw pointer - - if (castedComponent) { //Ensure that the cast was successful - componentVector.push_back(*castedComponent); //Add the dereferenced raw pointer to the vector<> - } - } - } - } - - return componentVector; //Return the vector<> -} - -template <typename T> -std::vector<std::pair<std::reference_wrapper<T>, std::uint32_t>> ComponentManager::GetComponentsByType() const { - std::type_index type = typeid(T); //Determine the type of T (this is used as the key of the unordered_map<>) - - std::vector<std::pair<std::reference_wrapper<T>, std::uint32_t>> componentVector; //Create an empty vector<> - std::uint32_t id = 0; //Set the id to 0 (the id will also be stored in the returned vector<>) - - if (mComponents.find(type) != mComponents.end()) { //Find the type (in the unordered_map<>) - - const std::vector<std::vector<std::unique_ptr<Component>>>& componentArray = mComponents.at(type); //Get the correct vector<> - - for (const std::vector<std::unique_ptr<Component>>& component : componentArray) { //Loop through the whole vector<> - for (const std::unique_ptr<Component>& componentPtr : component) { //Loop trough the whole vector<> - T* castedComponent = static_cast<T*>(componentPtr.get()); //Cast the unique_ptr to a raw pointer - - if (castedComponent) { //Ensure that the cast was successful - componentVector.emplace_back(std::ref(*castedComponent), id); //Pair the dereferenced raw pointer and the id and add it to the vector<> - } - } - - ++id; //Increase the id (the id will also be stored in the returned vector<>) - } - } - - return componentVector; //Return the vector<> -} diff --git a/mwe/ecs-homemade/inc/Components.h b/mwe/ecs-homemade/inc/Components.h deleted file mode 100644 index 2645a45..0000000 --- a/mwe/ecs-homemade/inc/Components.h +++ /dev/null @@ -1,29 +0,0 @@ -#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; -}; - -class Colider : public Component { -public: - Colider(int size); - - int mSize; -}; diff --git a/mwe/ecs-homemade/inc/GameObjectMax.h b/mwe/ecs-homemade/inc/GameObjectMax.h deleted file mode 100644 index f0bcec9..0000000 --- a/mwe/ecs-homemade/inc/GameObjectMax.h +++ /dev/null @@ -1,20 +0,0 @@ -#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, typename... Args> - void AddComponent(Args&&... args); - - 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 deleted file mode 100644 index 1e952ba..0000000 --- a/mwe/ecs-homemade/inc/GameObjectMax.hpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "ComponentManager.h" - -template <typename T, typename... Args> -void GameObject::AddComponent(Args&&... args) { - ComponentManager::GetInstance().AddComponent<T>(mId, std::forward<Args>(args)...); -} |