Elevate Engine 1
Loading...
Searching...
No Matches
ComponentLayout.h
Go to the documentation of this file.
1#pragma once
2#include <string>
3#include <cstring>
4#include <vector>
7
8namespace Elevate
9{
10 class Component;
11
13
15 {
16 std::string name;
17 std::string displayName;
18 std::string tooltip;
20 const void* data = nullptr;
21 size_t offset = 0;
22 uint32_t size = 0;
23 bool flatten = false;
24 bool readOnly = false;
25 bool isColor = false;
26 std::vector<ComponentField> children;
27
28 ComponentField() = default;
29
31 const std::string& name,
33 size_t offset,
34 const std::string& displayName = ""
35 )
37 {
39 {
40 size = 0;
41 }
42 else
43 {
45 }
46 }
47
49 const std::string& name,
51 size_t offset,
52 const std::string& displayName,
53 const std::vector<ComponentField>& childrenFields
54 )
56 {
58 {
59 size = 0;
60 }
61 else
62 {
64 }
65 }
66
67 ComponentField(const std::string& name, ComponentDataType type, const void* dataPtr)
68 : name(name), type(type), data(dataPtr) { }
69
70 ComponentField(const ComponentField& original, const void* dataPtr)
71 : name(original.name), type(original.type), offset(original.offset), size(original.size),
72 displayName(original.displayName), flatten(original.flatten), readOnly(original.readOnly),
73 isColor(original.isColor), data(dataPtr)
74 {
75 for (const auto& child : original.children)
76 {
77 const void* childDataPtr = reinterpret_cast<const char*>(dataPtr) + child.offset;
78 children.emplace_back(child, childDataPtr);
79 }
80 }
81
82 void CopyValue(Component* src, Component* clone) const
83 {
84 const void* srcData = reinterpret_cast<const char*>(src) + offset;
85 void* destData = reinterpret_cast<char*>(clone) + offset;
86
87 if (size > 0)
88 {
89 std::memcpy(destData, srcData, size);
90 }
91 else if (!children.empty())
92 {
93 for (auto& child : children)
94 {
95 child.CopyValue(src, clone);
96 }
97 }
98 }
99
100 inline const std::string& GetDisplayName() const
101 {
102 if (displayName.empty())
103 return name;
104 return displayName;
105 }
106
107 inline bool HasChildrens() { return !children.empty(); }
108 };
109
111 {
112 public:
113 ComponentLayout() = default;
114 ComponentLayout(const std::string& name, std::initializer_list<ComponentField> fields) : m_name(name), m_fields(fields) { }
115 ComponentLayout(const std::string& name, std::vector<ComponentField>& fields) : m_name(name), m_fields(fields) { }
116
117 // Regular and const operators to iterate easely trought fields
118 std::vector<ComponentField>::iterator begin() { return m_fields.begin(); }
119 std::vector<ComponentField>::iterator end() { return m_fields.end(); }
120 std::vector<ComponentField>::const_iterator begin() const { return m_fields.begin(); }
121 std::vector<ComponentField>::const_iterator end() const { return m_fields.end(); }
122 size_t GetFieldCount() const { return m_fields.size(); }
123 const std::vector<ComponentField>& GetFields() const { return m_fields; }
124
125
126 const std::string& GetName() const { return m_name; }
127 private:
128 std::vector<ComponentField> m_fields;
129 std::string m_name;
130 };
131}
std::vector< ComponentField >::const_iterator begin() const
std::vector< ComponentField >::iterator begin()
const std::vector< ComponentField > & GetFields() const
std::vector< ComponentField >::const_iterator end() const
ComponentLayout(const std::string &name, std::vector< ComponentField > &fields)
const std::string & GetName() const
ComponentLayout(const std::string &name, std::initializer_list< ComponentField > fields)
std::vector< ComponentField >::iterator end()
EngineDataType
Definition Data.h:106
EngineDataType ComponentDataType
uint32_t GetDataTypeSize(EngineDataType type)
Definition Data.h:121
ComponentField(const std::string &name, ComponentDataType type, size_t offset, const std::string &displayName, const std::vector< ComponentField > &childrenFields)
ComponentDataType type
ComponentField(const ComponentField &original, const void *dataPtr)
ComponentField(const std::string &name, ComponentDataType type, const void *dataPtr)
std::vector< ComponentField > children
ComponentField(const std::string &name, ComponentDataType type, size_t offset, const std::string &displayName="")
const std::string & GetDisplayName() const
void CopyValue(Component *src, Component *clone) const