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 template<typename COMPONENT_TYPE>
38 static void Register(ComponentId component);
39
40 static void DrawInspector(Game::Entity owner, ComponentId component, void* data, bool* commit);
41
42 // set to true if you want full information to be displayed in the inspector
43 bool debug = false;
44
45private:
48
50
52};
53
54//------------------------------------------------------------------------------
57template<typename TYPE>
58inline void
59ComponentDrawFuncT(Game::Entity owner, ComponentId component, void* data, bool* commit);
60
61//------------------------------------------------------------------------------
64template<typename TYPE, std::size_t i = 0>
65inline void
66InspectorDrawField(Game::Entity owner, ComponentId component, void* data, bool* commit)
67{
68 if constexpr (i < TYPE::Traits::num_fields)
69 {
70 if (TYPE::Traits::field_hide_in_inspector[i] && !ComponentInspection::Instance()->debug)
71 {
72 // Just move to the next field
73 InspectorDrawField<TYPE, i + 1>(owner, component, data, commit);
74 }
75 else
76 {
77 using field_tuple = typename TYPE::Traits::field_types;
78 using field_type = typename std::tuple_element<i, field_tuple>::type;
79 Util::String fieldName = TYPE::Traits::field_names[i];
80 fieldName.CamelCaseToWords();
81 fieldName.Capitalize();
82 ImGui::TableSetColumnIndex(0);
83 ImGui::AlignTextToFramePadding();
84 ImGui::Text(fieldName.AsCharPtr());
85 if (TYPE::Traits::field_descriptions[i] != nullptr)
86 {
87 if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled))
88 {
89 if (ImGui::BeginTooltip())
90 {
91 ImGui::TextDisabled(TYPE::Traits::field_typenames[i]);
92 ImGui::Text(TYPE::Traits::field_descriptions[i]);
93 ImGui::EndTooltip();
94 }
95 }
96 }
97 ImGui::TableSetColumnIndex(1);
98 ComponentDrawFuncT<field_type>(owner, component, (byte*)data + TYPE::Traits::field_byte_offsets[i], commit);
99
100 if constexpr (i < TYPE::Traits::num_fields - 1)
101 {
102 ImGui::TableNextRow();
103 InspectorDrawField<TYPE, i + 1>(owner, component, data, commit);
104 }
105 }
106 }
107}
108
109//------------------------------------------------------------------------------
112template<typename TYPE>
113inline void
114ComponentDrawFuncT(Game::Entity owner, ComponentId component, void* data, bool* commit)
115{
116 if constexpr (requires { &TYPE::Traits::num_fields; })
117 {
118 if constexpr (TYPE::Traits::num_fields > 0 && !std::is_enum<TYPE>())
119 {
120 InspectorDrawField<TYPE>(owner, component, data, commit);
121 }
122 }
123 return;
124}
125
126template<> void ComponentDrawFuncT<Game::Entity>(Game::Entity, ComponentId, void*, bool*);
127template<> void ComponentDrawFuncT<bool>(Game::Entity, ComponentId, void*, bool*);
128template<> void ComponentDrawFuncT<int>(Game::Entity, ComponentId, void*, bool*);
129template<> void ComponentDrawFuncT<int64_t>(Game::Entity, ComponentId, void*, bool*);
130template<> void ComponentDrawFuncT<uint>(Game::Entity, ComponentId, void*, bool*);
131template<> void ComponentDrawFuncT<uint64_t>(Game::Entity, ComponentId, void*, bool*);
132template<> void ComponentDrawFuncT<uint16_t>(Game::Entity, ComponentId, void*, bool*);
133template<> void ComponentDrawFuncT<int16_t>(Game::Entity, ComponentId, void*, bool*);
134template<> void ComponentDrawFuncT<float>(Game::Entity, ComponentId, void*, bool*);
135extern void (*StringAtomComponentDrawOverride) (Game::Entity, ComponentId, void*, bool*);
137template<> void ComponentDrawFuncT<Math::mat4>(Game::Entity, ComponentId, void*, bool*);
138template<> void ComponentDrawFuncT<Math::vec3>(Game::Entity, ComponentId, void*, bool*);
139template<> void ComponentDrawFuncT<Math::vec4>(Game::Entity, ComponentId, void*, bool*);
140template<> void ComponentDrawFuncT<Math::quat>(Game::Entity, ComponentId, void*, bool*);
141template<> void ComponentDrawFuncT<Game::Position>(Game::Entity, ComponentId, void*, bool*);
143template<> void ComponentDrawFuncT<Game::Scale>(Game::Entity, ComponentId, void*, bool*);
144template<> void ComponentDrawFuncT<Util::Color>(Game::Entity, ComponentId, void*, bool*);
145template<> void ComponentDrawFuncT<Util::BitField<16>>(Game::Entity, ComponentId, void*, bool*);
146template<> void ComponentDrawFuncT<Util::BitField<32>>(Game::Entity, ComponentId, void*, bool*);
147template<> void ComponentDrawFuncT<Util::BitField<64>>(Game::Entity, ComponentId, void*, bool*);
148
149//------------------------------------------------------------------------------
152template<typename COMPONENT_TYPE>
153void
155{
157 while (reg->inspectors.Size() <= component.id)
158 {
159 IndexT first = reg->inspectors.Size();
160 reg->inspectors.Grow();
162 reg->inspectors.Fill(first, reg->inspectors.Size() - first, nullptr);
163 }
164
165 n_assert(reg->inspectors[component.id] == nullptr);
167}
168
169} // namespace Game
Util::Array< DrawFunc > inspectors
Definition componentinspection.h:51
ComponentInspection()
Definition componentinspection.cc:77
void(*)(Game::Entity, Game::ComponentId, void *, bool *) DrawFunc
Definition componentinspection.h:32
static void Register(ComponentId component)
Definition componentinspection.h:154
static ComponentInspection * Singleton
Definition componentinspection.h:49
bool debug
Definition componentinspection.h:43
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
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:63
Nebula's dynamic array class.
Definition array.h:61
void Fill(IndexT first, SizeT num, const TYPE &elm)
fill array range with element
Definition array.h:1447
const SizeT Capacity() const
get overall allocated size of array in number of elements
Definition array.h:933
void Grow()
grow array with grow value
Definition array.h:600
void Resize(SizeT num)
Set size. Grows array if num is greater than capacity. Calls destroy on all objects at index > num!
Definition array.h:1682
const SizeT Size() const
get number of elements in array
Definition array.h:913
Nebula's universal string class.
Definition string.h:50
void Capitalize()
convert first char of string to upper case
Definition string.cc:959
const char * AsCharPtr() const
return contents as character pointer
Definition string.h:577
void CamelCaseToWords()
insert spaces before each capital letter in the string.
Definition string.cc:969
#define n_assert(exp)
Definition debug.h:58
Resolves local hierarchical transforms into the mandatory world transform components.
Definition graphicsmanager.h:66
MemDb::AttributeId ComponentId
Definition componentid.h:15
void ComponentDrawFuncT< int64_t >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:182
void ComponentDrawFuncT< Util::Color >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:444
void ComponentDrawFuncT< Math::vec4 >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:349
void ComponentDrawFuncT< Game::Position >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:375
void ComponentDrawFuncT< uint16_t >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:212
void ComponentDrawFuncT< Game::Entity >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:95
void ComponentDrawFuncT< int16_t >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:229
void ComponentDrawFuncT< Math::mat4 >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:317
void ComponentDrawFuncT< Math::vec3 >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:336
void ComponentDrawFuncT< Util::StringAtom >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:277
void(*) StringAtomComponentDrawOverride(Game::Entity, ComponentId, void *, bool *)
Definition componentinspection.cc:271
void ComponentDrawFuncT< uint64_t >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:246
void ComponentDrawFuncT< Game::Orientation >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:392
void ComponentDrawFuncT< int >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:169
void ComponentDrawFuncT< Math::quat >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:362
void ComponentDrawFuncT< uint >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:195
void ComponentDrawFuncT< Game::Scale >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:409
void ComponentDrawFuncT< bool >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:156
void ComponentDrawFuncT(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.h:114
void InspectorDrawField(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.h:66
void ComponentDrawFuncT< float >(Game::Entity owner, ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:263
An entity is essentially just an Id with some utility functions attached.
Definition entity.h:35
int IndexT
Definition types.h:41