Nebula
Loading...
Searching...
No Matches
componentinspection.h
Go to the documentation of this file.
1#pragma once
2//------------------------------------------------------------------------------
13//------------------------------------------------------------------------------
14#include "util/delegate.h"
15#include "util/stringatom.h"
16#include "game/entity.h"
17#include "game/componentid.h"
22#include "util/bitfield.h"
23#include "util/color.h"
24#include "imgui.h"
25
26namespace Game
27{
28
30{
31public:
32 using DrawFunc = void(*)(Game::Entity, Game::ComponentId, void*, bool*);
33
35 static void Destroy();
36
37 static void Register(ComponentId component, DrawFunc);
38
39 static void DrawInspector(Game::Entity owner, ComponentId component, void* data, bool* commit);
40
41 // set to true if you want full information to be displayed in the inspector
42 bool debug = false;
43
44private:
47
49
51};
52
53template<typename TYPE>
54inline void
55ComponentDrawFuncT(Game::Entity owner, ComponentId component, void* data, bool* commit);
56
57template<typename TYPE, std::size_t i = 0>
58inline void
59InspectorDrawField(Game::Entity owner, ComponentId component, void* data, bool* commit)
60{
61 if constexpr (i < TYPE::Traits::num_fields)
62 {
63 if (TYPE::Traits::field_hide_in_inspector[i] && !ComponentInspection::Instance()->debug)
64 {
65 // Just move to the next field
66 InspectorDrawField<TYPE, i + 1>(owner, component, data, commit);
67 }
68 else
69 {
70 using field_tuple = typename TYPE::Traits::field_types;
71 using field_type = typename std::tuple_element<i, field_tuple>::type;
72 Util::String fieldName = TYPE::Traits::field_names[i];
73 fieldName.CamelCaseToWords();
74 fieldName.Capitalize();
75 ImGui::TableSetColumnIndex(0);
76 ImGui::AlignTextToFramePadding();
77 ImGui::Text(fieldName.AsCharPtr());
78 if (TYPE::Traits::field_descriptions[i] != nullptr)
79 {
80 if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled))
81 {
82 if (ImGui::BeginTooltip())
83 {
84 ImGui::TextDisabled(TYPE::Traits::field_typenames[i]);
85 ImGui::Text(TYPE::Traits::field_descriptions[i]);
86 ImGui::EndTooltip();
87 }
88 }
89 }
90 ImGui::TableSetColumnIndex(1);
91 ComponentDrawFuncT<field_type>(owner, component, (byte*)data + TYPE::Traits::field_byte_offsets[i], commit);
92
93 if constexpr (i < TYPE::Traits::num_fields - 1)
94 {
95 ImGui::TableNextRow();
96 InspectorDrawField<TYPE, i + 1>(owner, component, data, commit);
97 }
98 }
99 }
100}
101
102//------------------------------------------------------------------------------
105template<typename TYPE>
106inline void
107ComponentDrawFuncT(Game::Entity owner, ComponentId component, void* data, bool* commit)
108{
109 if constexpr (requires { &TYPE::Traits::num_fields; })
110 {
111 if constexpr (TYPE::Traits::num_fields > 0 && !std::is_enum<TYPE>())
112 {
113 InspectorDrawField<TYPE>(owner, component, data, commit);
114 }
115 }
116 return;
117}
118
119template<> void ComponentDrawFuncT<Game::Entity>(Game::Entity, ComponentId, void*, bool*);
120template<> void ComponentDrawFuncT<bool>(Game::Entity, ComponentId, void*, bool*);
121template<> void ComponentDrawFuncT<int>(Game::Entity, ComponentId, void*, bool*);
122template<> void ComponentDrawFuncT<int64_t>(Game::Entity, ComponentId, void*, bool*);
123template<> void ComponentDrawFuncT<uint>(Game::Entity, ComponentId, void*, bool*);
124template<> void ComponentDrawFuncT<uint64_t>(Game::Entity, ComponentId, void*, bool*);
125template<> void ComponentDrawFuncT<uint16_t>(Game::Entity, ComponentId, void*, bool*);
126template<> void ComponentDrawFuncT<int16_t>(Game::Entity, ComponentId, void*, bool*);
127template<> void ComponentDrawFuncT<float>(Game::Entity, ComponentId, void*, bool*);
129template<> void ComponentDrawFuncT<Math::mat4>(Game::Entity, ComponentId, void*, bool*);
130template<> void ComponentDrawFuncT<Math::vec3>(Game::Entity, ComponentId, void*, bool*);
131template<> void ComponentDrawFuncT<Math::vec4>(Game::Entity, ComponentId, void*, bool*);
132template<> void ComponentDrawFuncT<Math::quat>(Game::Entity, ComponentId, void*, bool*);
133template<> void ComponentDrawFuncT<Game::Position>(Game::Entity, ComponentId, void*, bool*);
135template<> void ComponentDrawFuncT<Game::Scale>(Game::Entity, ComponentId, void*, bool*);
136template<> void ComponentDrawFuncT<Util::Color>(Game::Entity, ComponentId, void*, bool*);
137template<> void ComponentDrawFuncT<Util::BitField<16>>(Game::Entity, ComponentId, void*, bool*);
138template<> void ComponentDrawFuncT<Util::BitField<32>>(Game::Entity, ComponentId, void*, bool*);
139template<> void ComponentDrawFuncT<Util::BitField<64>>(Game::Entity, ComponentId, void*, bool*);
140
141} // namespace Game
Util::Array< DrawFunc > inspectors
Definition componentinspection.h:50
ComponentInspection()
Definition componentinspection.cc:96
void(*)(Game::Entity, Game::ComponentId, void *, bool *) DrawFunc
Definition componentinspection.h:32
static ComponentInspection * Singleton
Definition componentinspection.h:48
static void Register(ComponentId component, DrawFunc)
Definition componentinspection.cc:63
bool debug
Definition componentinspection.h:42
static void Destroy()
This static method is used to destroy the registry object and should be called right before the main ...
Definition componentinspection.cc:50
~ComponentInspection()
Definition componentinspection.cc:104
static ComponentInspection * Instance()
The registry's constructor is called by the Instance() method, and nobody else.
Definition componentinspection.cc:31
static void DrawInspector(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:82
Nebula's dynamic array class.
Definition array.h:60
Game::EditorState.
Definition graphicsmanager.h:67
MemDb::AttributeId ComponentId
Definition componentid.h:15
void ComponentDrawFuncT< int64_t >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:201
void ComponentDrawFuncT< Util::Color >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:452
void ComponentDrawFuncT< Math::vec4 >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:357
void ComponentDrawFuncT< Game::Position >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:383
void ComponentDrawFuncT< uint16_t >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:231
void ComponentDrawFuncT< Game::Entity >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:114
void ComponentDrawFuncT< int16_t >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:248
void ComponentDrawFuncT< Math::mat4 >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:325
void ComponentDrawFuncT< Math::vec3 >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:344
void ComponentDrawFuncT< Util::StringAtom >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:295
void ComponentDrawFuncT< uint64_t >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:265
void ComponentDrawFuncT< Game::Orientation >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:400
void ComponentDrawFuncT< int >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:188
void ComponentDrawFuncT< Math::quat >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:370
void ComponentDrawFuncT< uint >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:214
void ComponentDrawFuncT< Game::Scale >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:417
void ComponentDrawFuncT< bool >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:175
void ComponentDrawFuncT(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.h:107
void InspectorDrawField(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.h:59
void ComponentDrawFuncT< float >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:282
An entity is essentially just an Id with some utility functions attached.
Definition entity.h:35
Nebula's universal string class.
Definition String.cs:8
void CamelCaseToWords()
insert spaces before each capital letter in the string.
Definition string.cc:941
void Capitalize()
convert first char of string to upper case
Definition string.cc:931
const char * AsCharPtr() const
return contents as character pointer
Definition string.h:546