Grindstone Game Engine v0.2.0
An open source game engine and toolkit.
Loading...
Searching...
No Matches
ComponentRegistrar.hpp
1#pragma once
2
3#include <unordered_map>
4#include <string>
5#include <entt/entt.hpp>
6
7#include <EngineCore/ECS/EntityHandle.hpp>
8#include <EngineCore/Reflection/ComponentReflection.hpp>
9#include <EngineCore/WorldContext/WorldContextManager.hpp>
10#include <Common/HashedString.hpp>
11
12#include "ComponentFunctions.hpp"
13#include "ComponentFunctionsDefinitions.hpp"
14
15using namespace Grindstone;
16
17namespace Grindstone::ECS {
19 public:
20 template<typename ComponentType>
21 void RegisterComponent() {
22 SetupComponentFn setupComponentFn = nullptr;
23 if constexpr (HasConstruct<ComponentType>) {
24 setupComponentFn = ComponentType::Construct;
25 }
26
27 DestroyComponentFn destroyComponentFn = nullptr;
28 if constexpr (HasDestroy<ComponentType>) {
29 destroyComponentFn = ComponentType::Destroy;
30 }
31
32 RegisterComponent(
33 ComponentType::GetComponentHashString(),
35 setupComponentFn,
36 destroyComponentFn,
37 &ECS::ClearComponents<ComponentType>,
38 &ECS::CreateComponent<ComponentType>,
39 &ECS::RemoveComponent<ComponentType>,
40 &ECS::HasComponent<ComponentType>,
41 &ECS::TryGetComponent<ComponentType>,
42 &ECS::GetComponentReflectionData<ComponentType>,
43 &ECS::CopyRegistryComponents<ComponentType>
44 }
45 );
46 }
47
48 template<typename ComponentType>
49 void UnregisterComponent() {
50 Grindstone::EngineCore& engineCore = Grindstone::EngineCore::GetInstance();
51 Grindstone::WorldContextManager* worldContextManager = engineCore.GetWorldContextManager();
52 if (worldContextManager != nullptr) {
53 for (auto& worldContext : *worldContextManager) {
54 entt::registry& registry = worldContext->GetEntityRegistry();
55 registry.clear<ComponentType>();
56 }
57 }
58
59 auto comp = componentFunctionsList.find(ComponentType::GetComponentHashString());
60 if (comp != componentFunctionsList.end()) {
61 componentFunctionsList.erase(comp);
62 }
63 }
64
65 virtual void CopyRegistry(WorldContextSet& to, WorldContextSet& from);
66 virtual void CallCreateOnRegistry(WorldContextSet& worldContextSet);
67 virtual void CallDestroyOnRegistry(WorldContextSet& worldContextSet);
68 virtual void DestroyEntity(ECS::Entity entity);
69 virtual void RegisterComponent(Grindstone::HashedString name, ComponentFunctions componentFunctions);
70 virtual void UnregisterComponent(Grindstone::HashedString name);
71 virtual void* CreateComponentWithSetup(Grindstone::HashedString name, ECS::Entity entity);
72 virtual void* CreateComponentWithSetup(WorldContextSet& worldContextSet, Grindstone::HashedString name, ECS::Entity entity);
73 virtual void* CreateComponent(Grindstone::HashedString name, ECS::Entity entity);
74 virtual void RemoveComponent(Grindstone::HashedString name, ECS::Entity entity);
75 virtual bool HasComponent(Grindstone::HashedString name, ECS::Entity entity);
76 virtual bool TryGetComponent(Grindstone::HashedString name, ECS::Entity entity, void*& outComponent);
77 virtual bool TryGetComponentReflectionData(Grindstone::HashedString name, Grindstone::Reflection::TypeDescriptor_Struct& outReflectionData);
78 virtual void SetupComponent(Grindstone::HashedString componentType, ECS::Entity entity, void* componentPtr);
79 virtual void SetupComponent(WorldContextSet& worldContextSet, Grindstone::HashedString componentType, ECS::Entity entity, void* componentPtr);
80
81 using ComponentMap = std::unordered_map<Grindstone::HashedString, ComponentFunctions>;
82 virtual ComponentMap::iterator begin();
83 virtual ComponentMap::const_iterator begin() const;
84 virtual ComponentMap::iterator end();
85 virtual ComponentMap::const_iterator end() const;
86 private:
87 ComponentMap componentFunctionsList;
88 };
89}
Definition ComponentFunctions.hpp:22
Definition ComponentRegistrar.hpp:18
Definition Entity.hpp:15
Definition EngineCore.hpp:60
Definition HashedString.hpp:9
Definition WorldContextManager.hpp:12
Definition WorldContextSet.hpp:11
Definition ComponentFunctionsDefinitions.hpp:10
Definition ComponentFunctionsDefinitions.hpp:20
Definition TypeDescriptorStruct.hpp:9