diff options
Diffstat (limited to 'src/crepe')
-rw-r--r-- | src/crepe/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/crepe/Component.cpp | 2 | ||||
-rw-r--r-- | src/crepe/Component.h | 1 | ||||
-rw-r--r-- | src/crepe/ComponentManager.hpp | 13 | ||||
-rw-r--r-- | src/crepe/Metadata.cpp | 9 | ||||
-rw-r--r-- | src/crepe/Metadata.h | 22 | ||||
-rw-r--r-- | src/crepe/api/GameObject.cpp | 22 | ||||
-rw-r--r-- | src/crepe/api/GameObject.h | 10 | ||||
-rw-r--r-- | src/crepe/api/Transform.cpp | 6 | ||||
-rw-r--r-- | src/crepe/api/Transform.h | 3 | ||||
-rw-r--r-- | src/crepe/system/System.h | 4 |
11 files changed, 80 insertions, 14 deletions
diff --git a/src/crepe/CMakeLists.txt b/src/crepe/CMakeLists.txt index 8830e05..867329f 100644 --- a/src/crepe/CMakeLists.txt +++ b/src/crepe/CMakeLists.txt @@ -4,6 +4,7 @@ target_sources(crepe PUBLIC ComponentManager.cpp Component.cpp Collider.cpp + Metadata.cpp ) target_sources(crepe PUBLIC FILE_SET HEADERS FILES @@ -12,6 +13,7 @@ target_sources(crepe PUBLIC FILE_SET HEADERS FILES ComponentManager.hpp Component.h Collider.h + Metadata.h ) add_subdirectory(api) diff --git a/src/crepe/Component.cpp b/src/crepe/Component.cpp index 358ce31..78b47fa 100644 --- a/src/crepe/Component.cpp +++ b/src/crepe/Component.cpp @@ -3,3 +3,5 @@ using namespace crepe; Component::Component(uint32_t id) : game_object_id(id), active(true) {} + +int Component::get_instances_max() const { return -1; } diff --git a/src/crepe/Component.h b/src/crepe/Component.h index bc44865..039836e 100644 --- a/src/crepe/Component.h +++ b/src/crepe/Component.h @@ -13,6 +13,7 @@ protected: public: virtual ~Component() = default; + virtual int get_instances_max() const; public: uint32_t game_object_id; diff --git a/src/crepe/ComponentManager.hpp b/src/crepe/ComponentManager.hpp index 9b07f13..f469d12 100644 --- a/src/crepe/ComponentManager.hpp +++ b/src/crepe/ComponentManager.hpp @@ -30,9 +30,18 @@ T & ComponentManager::add_component(uint32_t id, Args &&... args) { // Create a new component of type T (arguments directly forwarded). The // constructor must be called by ComponentManager. - T * instance = new T(id, forward<Args>(args)...); + T * instance_pointer = new T(id, forward<Args>(args)...); + unique_ptr<T> instance = unique_ptr<T>(instance_pointer); + + // Check if the vector size is not greater than get_instances_max + if (instance->get_instances_max() != -1 + && components[type][id].size() >= instance->get_instances_max()) { + throw std::runtime_error( + "Exceeded maximum number of instances for this component type"); + } + // store its unique_ptr in the vector<> - components[type][id].push_back(unique_ptr<T>(instance)); + components[type][id].push_back(move(instance)); return *instance; } diff --git a/src/crepe/Metadata.cpp b/src/crepe/Metadata.cpp new file mode 100644 index 0000000..d362e0a --- /dev/null +++ b/src/crepe/Metadata.cpp @@ -0,0 +1,9 @@ +#include "Metadata.h" + +using namespace crepe; +using namespace std; + +Metadata::Metadata(uint32_t gameObjectId, string name, string tag) + : Component(gameObjectId), name(name), tag(tag) {} + +int Metadata::get_instances_max() const { return 1; } diff --git a/src/crepe/Metadata.h b/src/crepe/Metadata.h new file mode 100644 index 0000000..2f08476 --- /dev/null +++ b/src/crepe/Metadata.h @@ -0,0 +1,22 @@ +#pragma once + +#include <string> +#include <vector> + +#include "Component.h" + +namespace crepe { + +class Metadata : public Component { +public: + Metadata(uint32_t game_object_id, std::string name, std::string tag); + int get_instances_max() const; + +public: + std::string name; + std::string tag; + uint32_t parent = UINT32_MAX; + std::vector<uint32_t> children; +}; + +} // namespace crepe diff --git a/src/crepe/api/GameObject.cpp b/src/crepe/api/GameObject.cpp index 445a60d..2592d2d 100644 --- a/src/crepe/api/GameObject.cpp +++ b/src/crepe/api/GameObject.cpp @@ -1,7 +1,25 @@ +#include "api/Transform.h" + #include "GameObject.h" +#include "Metadata.h" using namespace crepe; using namespace std; -GameObject::GameObject(uint32_t id, string name, string tag, int layer) - : id(id), name(name), tag(tag), active(true), layer(layer) {} +GameObject::GameObject(uint32_t id, std::string name, std::string tag, + Point position, double rotation, double scale) + : id(id) { + ComponentManager & mgr = ComponentManager::get_instance(); + mgr.add_component<Transform>(this->id, position, rotation, scale); + mgr.add_component<Metadata>(this->id, name, tag); +} + +void GameObject::set_parent(GameObject & parent) { + auto & mgr = ComponentManager::get_instance(); + vector<reference_wrapper<Metadata>> thisMetadata + = mgr.get_components_by_id<Metadata>(this->id); + vector<reference_wrapper<Metadata>> parentMetadata + = mgr.get_components_by_id<Metadata>(parent.id); + thisMetadata.at(0).get().parent = parent.id; + parentMetadata.at(0).get().children.push_back(this->id); +} diff --git a/src/crepe/api/GameObject.h b/src/crepe/api/GameObject.h index b5d6399..dcd33ad 100644 --- a/src/crepe/api/GameObject.h +++ b/src/crepe/api/GameObject.h @@ -3,20 +3,20 @@ #include <cstdint> #include <string> +#include "api/Point.h" + namespace crepe { class GameObject { public: - GameObject(uint32_t id, std::string name, std::string tag, int layer); + GameObject(uint32_t id, std::string name, std::string tag, Point position, + double rotation, double scale); + void set_parent(GameObject & parent); template <typename T, typename... Args> T & add_component(Args &&... args); uint32_t id; - std::string name; - std::string tag; - bool active; - int layer; }; } // namespace crepe diff --git a/src/crepe/api/Transform.cpp b/src/crepe/api/Transform.cpp index 70b16bd..a80aff3 100644 --- a/src/crepe/api/Transform.cpp +++ b/src/crepe/api/Transform.cpp @@ -8,9 +8,11 @@ using namespace crepe; -Transform::Transform(uint32_t game_id, const Point & point, double rot, - double scale) +Transform::Transform(uint32_t game_id, Point point, double rot, double scale) : Component(game_id), position(point), rotation(rot), scale(scale) { dbg_trace(); } + Transform::~Transform() { dbg_trace(); } + +int Transform::get_instances_max() const { return 1; } diff --git a/src/crepe/api/Transform.h b/src/crepe/api/Transform.h index d416088..f918115 100644 --- a/src/crepe/api/Transform.h +++ b/src/crepe/api/Transform.h @@ -14,8 +14,9 @@ class Transform : public Component { // works similar (or the same) as those found in GLSL? public: - Transform(uint32_t id, const Point &, double, double); + Transform(uint32_t id, Point, double, double); ~Transform(); + int get_instances_max() const; //! Translation (shift) Point position; //! Rotation, in radians diff --git a/src/crepe/system/System.h b/src/crepe/system/System.h index ecbb7f5..8744920 100644 --- a/src/crepe/system/System.h +++ b/src/crepe/system/System.h @@ -8,8 +8,8 @@ public: virtual void update() = 0; protected: - System() {}; - virtual ~System() {}; + System(){}; + virtual ~System(){}; private: // singleton |