9 #ifndef TurtleBrains_Component_hpp
10 #define TurtleBrains_Component_hpp
12 #include <turtle_brains/core/tb_configuration.hpp>
13 #include <turtle_brains/core/tb_noncopyable.hpp>
14 #include <turtle_brains/core/tb_uuid.hpp>
24 namespace Implementation
26 enum class ComponentKeyType { };
27 enum class ComponentTypeKeyType { };
30 typedef TypedUUID<Implementation::ComponentKeyType> ComponentKey;
31 typedef TypedUUID<Implementation::ComponentTypeKeyType> ComponentTypeKey;
34 typedef std::unique_ptr<Component> ComponentPointer;
36 typedef std::function<ComponentPointer(Node&,
const ComponentKey&)> CreateComponentFunction;
38 namespace ComponentCreator
40 void RegisterComponent(
const ComponentTypeKey& componentTypeKey, CreateComponentFunction createCallback);
41 void UnregisterComponent(
const ComponentTypeKey& componentTypeKey);
50 void EnableComponent(
const ComponentTypeKey& componentTypeKey);
51 void DisableComponent(
const ComponentTypeKey& componentTypeKey);
53 template<
typename ComponentType>
void EnableComponent(
void) { EnableComponent(ComponentType::ComponentTypeKey()); }
54 template<
typename ComponentType>
void DisableComponent(
void) { DisableComponent(ComponentType::ComponentTypeKey()); }
57 ComponentPointer CreateComponent(Node& node,
const ComponentKey& componentKey,
const ComponentTypeKey& componentTypeKey);
59 template<
typename ComponentType> std::unique_ptr<ComponentType> CreateComponent(Node& node,
60 const ComponentKey& componentKey = ComponentKey::Generate4())
62 ComponentPointer component = CreateComponent(node, componentKey, ComponentType::ComponentTypeKey());
63 if (
nullptr != component)
65 ComponentType* derivedComponent =
dynamic_cast<ComponentType*
>(component.get());
66 if (
nullptr != derivedComponent)
70 return std::unique_ptr<ComponentType>(derivedComponent);
73 tb_error(
"Expected a ComponentType to match the ComponentType...");
101 virtual void OnAwake(
void) { }
102 virtual void OnDestroy(
void) { }
104 virtual void OnActivate(
void) { }
105 virtual void OnDeactivate(
void) { }
107 virtual void OnSimulate(
void) { }
108 virtual void OnUpdate(
const float ) { }
109 virtual void OnRender(
void)
const { }
111 virtual void OnTriggerEnter(
const Node& ) { }
112 virtual void OnTriggerStay(
const Node& ) { }
113 virtual void OnTriggerLeave(
const Node& ) { }
115 inline const Node& GetNode(
void)
const {
return mNode; }
117 bool IsValid(
void)
const {
return (ComponentTypeKey::Invalid() != mComponentTypeKey && ComponentKey::Invalid() != mComponentKey); }
119 bool IsActive(
void)
const;
120 inline bool IsActiveSelf(
void)
const {
return mIsActive; }
121 void SetActive(
const bool isActive);
123 inline const ComponentKey& GetKey(
void)
const {
return mComponentKey; }
124 inline const ComponentTypeKey& GetTypeKey(
void)
const {
return mComponentTypeKey; }
126 template<
typename ComponentType>
static ComponentTypeKey RegisterComponent(
void)
128 ComponentCreator::RegisterComponent(ComponentType::ComponentTypeKey(), [](
Node& node,
const ComponentKey& componentKey){
129 return std::make_unique<ComponentType>(node, componentKey);
131 return ComponentType::ComponentTypeKey();
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