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(SetupComponentFn setupComponentFn = nullptr, DestroyComponentFn destroyComponentFn = nullptr) {
22 RegisterComponent(
23 ComponentType::GetComponentHashString(),
25 setupComponentFn,
26 destroyComponentFn,
27 &ECS::CreateComponent<ComponentType>,
28 &ECS::RemoveComponent<ComponentType>,
29 &ECS::HasComponent<ComponentType>,
30 &ECS::TryGetComponent<ComponentType>,
31 &ECS::GetComponentReflectionData<ComponentType>,
32 &ECS::CopyRegistryComponents<ComponentType>
33 }
34 );
35 }
36
37 template<typename ComponentType>
38 void UnregisterComponent() {
39 Grindstone::EngineCore& engineCore = Grindstone::EngineCore::GetInstance();
40 Grindstone::WorldContextManager* worldContextManager = engineCore.GetWorldContextManager();
41 if (worldContextManager != nullptr) {
42 for (Grindstone::UniquePtr<Grindstone::WorldContextSet>& worldContext : *worldContextManager) {
43 entt::registry& registry = worldContext.Get()->GetEntityRegistry();
44 registry.clear<ComponentType>();
45 }
46 }
47
48 auto comp = componentFunctionsList.find(ComponentType::GetComponentHashString());
49 if (comp != componentFunctionsList.end()) {
50 componentFunctionsList.erase(comp);
51 }
52 }
53
54 virtual void CopyRegistry(WorldContextSet& to, WorldContextSet& from);
55 virtual void CallCreateOnRegistry(WorldContextSet& worldContextSet);
56 virtual void CallDestroyOnRegistry(WorldContextSet& worldContextSet);
57 virtual void DestroyEntity(ECS::Entity entity);
58 virtual void RegisterComponent(Grindstone::HashedString name, ComponentFunctions componentFunctions);
59 virtual void UnregisterComponent(Grindstone::HashedString name);
60 virtual void* CreateComponentWithSetup(Grindstone::HashedString name, ECS::Entity entity);
61 virtual void* CreateComponentWithSetup(WorldContextSet& worldContextSet, Grindstone::HashedString name, ECS::Entity entity);
62 virtual void* CreateComponent(Grindstone::HashedString name, ECS::Entity entity);
63 virtual void RemoveComponent(Grindstone::HashedString name, ECS::Entity entity);
64 virtual bool HasComponent(Grindstone::HashedString name, ECS::Entity entity);
65 virtual bool TryGetComponent(Grindstone::HashedString name, ECS::Entity entity, void*& outComponent);
66 virtual bool TryGetComponentReflectionData(Grindstone::HashedString name, Grindstone::Reflection::TypeDescriptor_Struct& outReflectionData);
67 virtual void SetupComponent(Grindstone::HashedString componentType, ECS::Entity entity, void* componentPtr);
68 virtual void SetupComponent(WorldContextSet& worldContextSet, Grindstone::HashedString componentType, ECS::Entity entity, void* componentPtr);
69
70 using ComponentMap = std::unordered_map<Grindstone::HashedString, ComponentFunctions>;
71 virtual ComponentMap::iterator begin();
72 virtual ComponentMap::const_iterator begin() const;
73 virtual ComponentMap::iterator end();
74 virtual ComponentMap::const_iterator end() const;
75 private:
76 ComponentMap componentFunctionsList;
77 };
78}
Definition ComponentFunctions.hpp:21
Definition ComponentRegistrar.hpp:18
Definition Entity.hpp:15
Definition EngineCore.hpp:58
Definition HashedString.hpp:9
Definition UniquePtr.hpp:7
Definition WorldContextManager.hpp:12
Definition WorldContextSet.hpp:11
Definition TypeDescriptorStruct.hpp:9