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 "imgui.h"
23
24namespace Game
25{
26
28{
29public:
30 using DrawFunc = void(*)(Game::ComponentId, void*, bool*);
31
33 static void Destroy();
34
35 static void Register(ComponentId component, DrawFunc);
36
37 static void DrawInspector(ComponentId component, void* data, bool* commit);
38
39private:
42
44
46};
47
48template<typename TYPE>
49void
50ComponentDrawFuncT(ComponentId component, void* data, bool* commit);
51
52template<typename TYPE, std::size_t i = 0>
53void InspectorDrawField(ComponentId component, void* data, bool* commit)
54{
55 if constexpr (i < TYPE::Traits::num_fields)
56 {
57 using field_tuple = typename TYPE::Traits::field_types;
58 using field_type = typename std::tuple_element<i, field_tuple>::type;
59 ImGui::Text(TYPE::Traits::field_names[i]);
60 ImGui::SameLine();
61 ComponentDrawFuncT<field_type>(component, (byte*)data + TYPE::Traits::field_byte_offsets[i], commit);
62 InspectorDrawField<TYPE, i + 1>(component, data, commit);
63 }
64}
65
66//------------------------------------------------------------------------------
69template<typename TYPE>
70void
71ComponentDrawFuncT(ComponentId component, void* data, bool* commit)
72{
73 if constexpr (requires { &TYPE::Traits::num_fields; })
74 {
75 if constexpr (TYPE::Traits::num_fields > 0 && !std::is_enum<TYPE>())
76 {
77 //UnrollTypesAndInspect<TYPE>(std::make_index_sequence<TYPE::Traits::num_fields>(), component, data, commit);
78 InspectorDrawField<TYPE>(component, data, commit);
79 }
80 }
81 return;
82}
83
84template<> void ComponentDrawFuncT<Game::Entity>(ComponentId, void*, bool*);
85template<> void ComponentDrawFuncT<bool>(ComponentId, void*, bool*);
86template<> void ComponentDrawFuncT<int>(ComponentId, void*, bool*);
87template<> void ComponentDrawFuncT<uint>(ComponentId, void*, bool*);
88template<> void ComponentDrawFuncT<float>(ComponentId, void*, bool*);
89template<> void ComponentDrawFuncT<Util::StringAtom>(ComponentId, void*, bool*);
90template<> void ComponentDrawFuncT<Math::mat4>(ComponentId, void*, bool*);
91template<> void ComponentDrawFuncT<Math::vec3>(ComponentId, void*, bool*);
92template<> void ComponentDrawFuncT<Game::Position>(ComponentId, void*, bool*);
93template<> void ComponentDrawFuncT<Game::Orientation>(ComponentId, void*, bool*);
94template<> void ComponentDrawFuncT<Game::Scale>(ComponentId, void*, bool*);
95
96} // namespace Game
Component inspection functions.
Definition componentinspection.h:28
Util::Array< DrawFunc > inspectors
Definition componentinspection.h:45
ComponentInspection()
Definition componentinspection.cc:88
static ComponentInspection * Singleton
Definition componentinspection.h:43
static void Register(ComponentId component, DrawFunc)
Definition componentinspection.cc:55
void(*)(Game::ComponentId, void *, bool *) DrawFunc
Definition componentinspection.h:30
static void DrawInspector(ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:74
static void Destroy()
This static method is used to destroy the registry object and should be called right before the main ...
Definition componentinspection.cc:42
~ComponentInspection()
Definition componentinspection.cc:96
static ComponentInspection * Instance()
The registry's constructor is called by the Instance() method, and nobody else.
Definition componentinspection.cc:25
Nebula's dynamic array class.
Definition array.h:60
Definition orientation.h:7
MemDb::AttributeId ComponentId
Definition componentid.h:15
void ComponentDrawFuncT< Game::Entity >(ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:106
void ComponentDrawFuncT< Math::mat4 >(ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:205
void ComponentDrawFuncT(ComponentId component, void *data, bool *commit)
Definition componentinspection.h:71
void ComponentDrawFuncT< bool >(ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:122
void ComponentDrawFuncT< Game::Position >(ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:241
void ComponentDrawFuncT< Util::StringAtom >(ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:181
void ComponentDrawFuncT< int >(ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:136
void ComponentDrawFuncT< Game::Orientation >(ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:257
void ComponentDrawFuncT< float >(ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:166
void InspectorDrawField(ComponentId component, void *data, bool *commit)
Definition componentinspection.h:53
void ComponentDrawFuncT< uint >(ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:151
void ComponentDrawFuncT< Game::Scale >(ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:273
void ComponentDrawFuncT< Math::vec3 >(ComponentId component, void *data, bool *commit)
Definition componentinspection.cc:226
Definition attributeid.h:19