Grindstone Game Engine v0.2.0
An open source game engine and toolkit.
Loading...
Searching...
No Matches
ComponentFunctionsDefinitions.hpp
1#pragma once
2
3#include <entt/entt.hpp>
4#include <EngineCore/WorldContext/WorldContextSet.hpp>
5
6#include "ComponentFunctions.hpp"
7
8namespace Grindstone::ECS {
9 template<typename ComponentType>
10 void* CreateComponent(entt::registry& registry, entt::entity entity) {
11 return &registry.emplace<ComponentType>(entity);
12 }
13
14 template<typename ComponentType>
15 void RemoveComponent(entt::registry& registry, entt::entity entity) {
16 if (registry.any_of<ComponentType>(entity)) {
17 registry.remove<ComponentType>(entity);
18 }
19 }
20
21 template<typename ComponentType>
22 Grindstone::Reflection::TypeDescriptor_Struct GetComponentReflectionData() {
23 return ComponentType::reflectionInfo;
24 }
25
26 template<typename ComponentType>
27 bool TryGetComponent(entt::registry& registry, entt::entity entity, void*& outComponent) {
28 ComponentType* foundComp = registry.try_get<ComponentType>(entity);
29 outComponent = foundComp;
30
31 return foundComp != nullptr;
32 }
33
34 template<typename ComponentType>
35 bool HasComponent(entt::registry& registry, entt::entity entity) {
36 return registry.all_of<ComponentType>(entity);
37 }
38
39 template<typename T, typename = void>
40 struct has_clone : std::false_type {};
41
42 template<typename T>
43 struct has_clone<T, std::void_t<decltype(
44 std::declval<const T&>().Clone(
45 std::declval<Grindstone::WorldContextSet&>(),
46 std::declval<entt::entity>()
47 )
48 )>> : std::true_type {};
49
50 template<typename T>
51 constexpr bool has_clone_v = has_clone<T>::value;
52
53 template<typename ComponentType>
54 void CopyRegistryComponents(WorldContextSet& dst, WorldContextSet& src) {
55 entt::registry& srcRegistry = src.GetEntityRegistry();
56 entt::registry& dstRegistry = dst.GetEntityRegistry();
57
58 auto srcEntities = srcRegistry.view<ComponentType>();
59 if constexpr (has_clone_v<ComponentType>) {
60 for (entt::entity entityID : srcEntities) {
61 ComponentType& srcComponent = srcRegistry.get<ComponentType>(entityID);
62 dstRegistry.emplace_or_replace<ComponentType>(entityID, srcComponent.Clone(dst, entityID));
63 }
64 }
65 else {
66 for (entt::entity entityID : srcEntities) {
67 dstRegistry.emplace_or_replace<ComponentType>(entityID, srcRegistry.get<ComponentType>(entityID));
68 }
69 }
70 }
71}
Definition WorldContextSet.hpp:11
Definition ComponentFunctionsDefinitions.hpp:40