Elevate Engine 1
Loading...
Searching...
No Matches
ComponentRegistry.inl
Go to the documentation of this file.
1#pragma once
3
4#include <entt/entt.hpp>
5#include <initializer_list>
6#include <string>
7#include <typeindex>
8#include <typeinfo>
9#include <variant>
10
15
16namespace Elevate
17{
18 class Component;
19 class GameObject;
20
21 struct ColorTag;
22 struct DisplayNameTag;
23 struct EditorIconTag;
24 struct FlattenTag;
25 struct HideInInspectorTag;
26 struct ReadOnlyTag;
27 struct TooltipTag;
28}
29
30namespace Elevate
31{
32 template<typename T>
33 void ComponentRegistry::Register(const std::string& name, EECategory category, std::vector<FieldOption>& options) {
34 std::type_index ti(typeid(T));
35
36 bool visible = true;
37 std::string iconPath;
38 for (FieldOption& option : options)
39 {
40 if (std::holds_alternative<HideInInspectorTag>(option)) {
41 visible = false;
42 }
43 else if (std::holds_alternative<EditorIconTag>(option)) {
44 iconPath = std::get<EditorIconTag>(option).Path;
45 }
46 }
47
48 GetEntries().emplace(ti, Entry{
49 name,
50 ti,
51 category,
52 [](std::weak_ptr<GameObject> go) -> Component* {
53 if (std::shared_ptr<GameObject> obj = go.lock()) {
54 return obj->GetComponent<T>();
55 }
56 return nullptr;
57 },
58 [](std::weak_ptr<GameObject> go) -> Component* {
59 if (std::shared_ptr<GameObject> obj = go.lock()) {
60 return &obj->AddComponent<T>();
61 }
62 return nullptr;
63 },
64 [](std::weak_ptr<GameObject> go) -> void {
65 if (std::shared_ptr<GameObject> obj = go.lock()) {
66 obj->RemoveComponent<T>();
67 }
68 },
69 visible,
70 iconPath
71 });
72 }
73
74 template<typename Class, typename FieldType>
75 void ComponentRegistry::AddProperty(FieldType Class::* member, const std::string& name, std::initializer_list<FieldOption> options)
76 {
77 constexpr EngineDataType type = DeduceEngineDataType<FieldType>();
78 FieldMeta meta;
79 for (auto&& opt : options) {
80 if (std::holds_alternative<FlattenTag>(opt)) {
81 meta.flatten = true;
82 }
83 else if (std::holds_alternative<DisplayNameTag>(opt)) {
84 meta.displayName = std::get<DisplayNameTag>(opt).value;
85 }
86 else if (std::holds_alternative<TooltipTag>(opt)) {
87 meta.tooltip = std::get<TooltipTag>(opt).text;
88 }
89 else if (std::holds_alternative<ReadOnlyTag>(opt)) {
90 meta.readOnly = true;
91 }
92 else if (std::holds_alternative<ColorTag>(opt)) {
93 meta.isColor = true;
94 }
95 }
96
97 std::string cleanedName = GetCleanedName(name);
98
99#ifdef EE_REGISTRY_LOG
100 EE_TRACE(" --> Exposed field : %s flatten=%d displayName=%s", cleanedName.c_str(), meta.flatten, meta.displayName.c_str());
101#endif
102
103 auto& customFields = GetCustomComponentFields();
104 std::string typeName = typeid(FieldType).name();
105 size_t offset = reinterpret_cast<size_t>(&(reinterpret_cast<Class const volatile*>(0)->*member));
106
107 ComponentField field;
108 if (customFields.find(typeName) != customFields.end())
109 {
110 field = ComponentField(cleanedName, EngineDataType::Custom, offset, meta.displayName, customFields[typeName]);
111 field.flatten = meta.flatten;
112 }
113 else
114 {
115 field = ComponentField(cleanedName, type, offset, meta.displayName);
116 }
117 field.isColor = meta.isColor;
118 field.tooltip = meta.tooltip;
119 field.readOnly = meta.readOnly;
120 CompilationClassFieldStack().push_back(field);
121 }
122}
#define EE_TRACE(...)
Definition Log.h:66
static void Register(const std::string &name, EECategory category, std::vector< FieldOption > &options)
static std::unordered_map< std::type_index, Entry > & GetEntries()
static std::map< std::string, std::vector< ComponentField > > & GetCustomComponentFields()
static std::string GetCleanedName(std::string rawName)
static void AddProperty(FieldType Class::*member, const std::string &name, std::initializer_list< FieldOption > options)
static std::vector< ComponentField > & CompilationClassFieldStack()
EngineDataType
Definition Data.h:106
std::variant< HideInInspectorTag, EditorIconTag, FlattenTag, DisplayNameTag, TooltipTag, ReadOnlyTag, ColorTag > FieldOption