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(std::declval<const T&>().Clone(
44 std::declval<Grindstone::WorldContextSet&>(), std::declval<entt::entity>()))>> : std::true_type {};
45
46 template<typename T>
47 constexpr bool has_clone_v = has_clone<T>::value;
48
49 template<typename ComponentType>
50 void CopyRegistryComponents(WorldContextSet& dst, WorldContextSet& src) {
51 entt::registry& srcRegistry = src.GetEntityRegistry();
52 entt::registry& dstRegistry = dst.GetEntityRegistry();
53
54 auto srcEntities = srcRegistry.view<ComponentType>();
55 if constexpr (has_clone_v<ComponentType>) {
56 for (entt::entity entityID : srcEntities) {
57 ComponentType& srcComponent = srcRegistry.get<ComponentType>(entityID);
58 dstRegistry.emplace_or_replace<ComponentType>(entityID, srcComponent.Clone(dst, entityID));
59 }
60 }
61 else {
62 for (entt::entity entityID : srcEntities) {
63 ComponentType srcComponentCpy = srcRegistry.get<ComponentType>(entityID);
64 dstRegistry.emplace_or_replace<ComponentType>(entityID, srcComponentCpy);
65 }
66 }
67 }
68}
Definition WorldContextSet.hpp:11
Definition ComponentFunctionsDefinitions.hpp:40