TurtleBrains  0.3.5
High quality, portable, C++ framework for rapid 2D game development.
tb_component.hpp
1 
9 #ifndef TurtleBrains_Component_hpp
10 #define TurtleBrains_Component_hpp
11 
12 #include <turtle_brains/core/tb_configuration.hpp>
13 #include <turtle_brains/core/tb_noncopyable.hpp>
14 #include <turtle_brains/core/tb_uuid.hpp>
15 
16 #include <vector>
17 #include <memory>
18 
19 namespace TurtleBrains::Core
20 {
21 
22  class Node;
23 
24  namespace Implementation
25  {
26  enum class ComponentKeyType { };
27  enum class ComponentTypeKeyType { };
28  };
29 
30  typedef TypedUUID<Implementation::ComponentKeyType> ComponentKey;
31  typedef TypedUUID<Implementation::ComponentTypeKeyType> ComponentTypeKey;
32 
33  class Component;
34  typedef std::unique_ptr<Component> ComponentPointer;
35 
36  typedef std::function<ComponentPointer(Node&, const ComponentKey&)> CreateComponentFunction;
37 
38  namespace ComponentCreator
39  {
40  void RegisterComponent(const ComponentTypeKey& componentTypeKey, CreateComponentFunction createCallback);
41  void UnregisterComponent(const ComponentTypeKey& componentTypeKey);
42 
50  void EnableComponent(const ComponentTypeKey& componentTypeKey);
51  void DisableComponent(const ComponentTypeKey& componentTypeKey);
52 
53  template<typename ComponentType> void EnableComponent(void) { EnableComponent(ComponentType::ComponentTypeKey()); }
54  template<typename ComponentType> void DisableComponent(void) { DisableComponent(ComponentType::ComponentTypeKey()); }
55 
56 
57  ComponentPointer CreateComponent(Node& node, const ComponentKey& componentKey, const ComponentTypeKey& componentTypeKey);
58 
59  template<typename ComponentType> std::unique_ptr<ComponentType> CreateComponent(Node& node,
60  const ComponentKey& componentKey = ComponentKey::Generate4())
61  {
62  ComponentPointer component = CreateComponent(node, componentKey, ComponentType::ComponentTypeKey());
63  if (nullptr != component)
64  {
65  ComponentType* derivedComponent = dynamic_cast<ComponentType*>(component.get());
66  if (nullptr != derivedComponent)
67  { // This will transfer the ownership to from the component unique_ptr into the returned ComponentType
68  // unique_ptr.
69  component.release();
70  return std::unique_ptr<ComponentType>(derivedComponent);
71  }
72 
73  tb_error("Expected a ComponentType to match the ComponentType...");
74  }
75 
76  return nullptr;
77  }
78  };
79 
84  // and since this is polymorphic use a virtual destructor. It is also required to add a static function
95  {
96  public:
97  const Node& mNode;
98 
99  virtual ~Component(void);
100 
101  virtual void OnAwake(void) { }
102  virtual void OnDestroy(void) { }
103 
104  virtual void OnActivate(void) { }
105  virtual void OnDeactivate(void) { }
106 
107  virtual void OnSimulate(void) { }
108  virtual void OnUpdate(const float /*deltaTime*/) { }
109  virtual void OnRender(void) const { }
110 
111  virtual void OnTriggerEnter(const Node& /*otherNode*/) { }
112  virtual void OnTriggerStay(const Node& /*otherNode*/) { }
113  virtual void OnTriggerLeave(const Node& /*otherNode*/) { }
114 
115  inline const Node& GetNode(void) const { return mNode; }
116 
117  bool IsValid(void) const { return (ComponentTypeKey::Invalid() != mComponentTypeKey && ComponentKey::Invalid() != mComponentKey); }
118 
119  bool IsActive(void) const;
120  inline bool IsActiveSelf(void) const { return mIsActive; }
121  void SetActive(const bool isActive);
122 
123  inline const ComponentKey& GetKey(void) const { return mComponentKey; }
124  inline const ComponentTypeKey& GetTypeKey(void) const { return mComponentTypeKey; }
125 
126  template<typename ComponentType> static ComponentTypeKey RegisterComponent(void)
127  {
128  ComponentCreator::RegisterComponent(ComponentType::ComponentTypeKey(), [](Node& node, const ComponentKey& componentKey){
129  return std::make_unique<ComponentType>(node, componentKey);
130  });
131  return ComponentType::ComponentTypeKey();
132  }
133 
134  protected:
135  Node& mMutableNode;
136 
137  Component(Node& node, const ComponentKey& componentKey, const ComponentTypeKey& componentTypeKey);
138 
139  private:
140  friend class Node;
141  const ComponentTypeKey mComponentTypeKey;
142  const ComponentKey mComponentKey;
143  bool mIsActive;
144  };
145 
146 }; /* namespace TurtleBrains::Core */
147 
148 namespace tbCore = TurtleBrains::Core;
149 
150 #endif /* TurtleBrains_Component_hpp */
Definition: tb_component.hpp:95
Definition: tb_node.hpp:70
Definition: tb_noncopyable.hpp:21
Definition: tb_uuid.hpp:33
#define tb_error(message,...)
Definition: tb_error.hpp:23
Contains core functionality for each component of the API.
Definition: tb_debug_logger.hpp:125