Flecs v4.0
A fast entity component system (ECS) for C & C++
Loading...
Searching...
No Matches
untyped_component.inl
Go to the documentation of this file.
1
13private:
14
16untyped_component& internal_member(
17 flecs::entity_t type_id,
18 flecs::entity_t unit,
19 const char *name,
20 int32_t count = 0,
21 size_t offset = 0,
22 bool use_offset = false)
23{
24 ecs_entity_desc_t desc = {};
25 desc.name = name;
26 desc.parent = id_;
27 ecs_entity_t eid = ecs_entity_init(world_, &desc);
28 ecs_assert(eid != 0, ECS_INTERNAL_ERROR, NULL);
29
30 flecs::entity e(world_, eid);
31
32 Member m = {};
33 m.type = type_id;
34 m.unit = unit;
35 m.count = count;
36 m.offset = static_cast<int32_t>(offset);
37 m.use_offset = use_offset;
38 e.set<Member>(m);
39
40 return *this;
41}
42
43public:
44
47 flecs::entity_t type_id,
48 flecs::entity_t unit,
49 const char *name,
50 int32_t count = 0)
51{
52 return internal_member(type_id, unit, name, count, 0, false);
53}
54
57 flecs::entity_t type_id,
58 flecs::entity_t unit,
59 const char *name,
60 int32_t count,
61 size_t offset)
62{
63 return internal_member(type_id, unit, name, count, offset, true);
64}
65
68 flecs::entity_t type_id,
69 const char* name,
70 int32_t count = 0)
71{
72 return member(type_id, 0, name, count);
73}
74
77 flecs::entity_t type_id,
78 const char* name,
79 int32_t count,
80 size_t offset)
81{
82 return member(type_id, 0, name, count, offset);
83}
84
86template <typename MemberType>
88 const char *name,
89 int32_t count = 0)
90{
91 flecs::entity_t type_id = _::type<MemberType>::id(world_);
92 return member(type_id, name, count);
93}
94
96template <typename MemberType>
98 const char *name,
99 int32_t count,
100 size_t offset)
101{
102 flecs::entity_t type_id = _::type<MemberType>::id(world_);
103 return member(type_id, name, count, offset);
104}
105
107template <typename MemberType>
109 flecs::entity_t unit,
110 const char *name,
111 int32_t count = 0)
112{
113 flecs::entity_t type_id = _::type<MemberType>::id(world_);
114 return member(type_id, unit, name, count);
115}
116
118template <typename MemberType>
120 flecs::entity_t unit,
121 const char *name,
122 int32_t count,
123 size_t offset)
124{
125 flecs::entity_t type_id = _::type<MemberType>::id(world_);
126 return member(type_id, unit, name, count, offset);
127}
128
130template <typename MemberType, typename UnitType>
132 const char *name,
133 int32_t count = 0)
134{
135 flecs::entity_t type_id = _::type<MemberType>::id(world_);
136 flecs::entity_t unit_id = _::type<UnitType>::id(world_);
137 return member(type_id, unit_id, name, count);
138}
139
141template <typename MemberType, typename UnitType>
143 const char *name,
144 int32_t count,
145 size_t offset)
146{
147 flecs::entity_t type_id = _::type<MemberType>::id(world_);
148 flecs::entity_t unit_id = _::type<UnitType>::id(world_);
149 return member(type_id, unit_id, name, count, offset);
150}
151
153template <typename MemberType, typename ComponentType,
154 typename RealType = typename std::remove_extent<MemberType>::type>
156 const char* name,
157 const MemberType ComponentType::* ptr)
158{
159 flecs::entity_t type_id = _::type<RealType>::id(world_);
160 size_t offset = reinterpret_cast<size_t>(&(static_cast<ComponentType*>(nullptr)->*ptr));
161 return member(type_id, name, std::extent<MemberType>::value, offset);
162}
163
165template <typename MemberType, typename ComponentType,
166 typename RealType = typename std::remove_extent<MemberType>::type>
168 flecs::entity_t unit,
169 const char* name,
170 const MemberType ComponentType::* ptr)
171{
172 flecs::entity_t type_id = _::type<RealType>::id(world_);
173 size_t offset = reinterpret_cast<size_t>(&(static_cast<ComponentType*>(nullptr)->*ptr));
174 return member(type_id, unit, name, std::extent<MemberType>::value, offset);
175}
176
178template <typename UnitType, typename MemberType, typename ComponentType,
179 typename RealType = typename std::remove_extent<MemberType>::type>
181 const char* name,
182 const MemberType ComponentType::* ptr)
183{
184 flecs::entity_t type_id = _::type<RealType>::id(world_);
185 flecs::entity_t unit_id = _::type<UnitType>::id(world_);
186 size_t offset = reinterpret_cast<size_t>(&(static_cast<ComponentType*>(nullptr)->*ptr));
187 return member(type_id, unit_id, name, std::extent<MemberType>::value, offset);
188}
189
191template <typename T = int32_t>
193 const char *name,
194 T value)
195{
196 ecs_add_id(world_, id_, _::type<flecs::Enum>::id(world_));
197
198 ecs_entity_desc_t desc = {};
199 desc.name = name;
200 desc.parent = id_;
201 ecs_entity_t eid = ecs_entity_init(world_, &desc);
202 ecs_assert(eid != 0, ECS_INTERNAL_ERROR, NULL);
203
204 ecs_set_id(world_, eid,
205 ecs_pair(flecs::Constant, _::type<T>::id(world_)), sizeof(T),
206 &value);
207
208 return *this;
209}
210
212template <typename T = uint32_t>
214 const char *name,
215 T value)
216{
217 ecs_add_id(world_, id_, _::type<flecs::Bitmask>::id(world_));
218
219 ecs_entity_desc_t desc = {};
220 desc.name = name;
221 desc.parent = id_;
222 ecs_entity_t eid = ecs_entity_init(world_, &desc);
223 ecs_assert(eid != 0, ECS_INTERNAL_ERROR, NULL);
224
225 ecs_set_id(world_, eid,
226 ecs_pair(flecs::Constant, _::type<T>::id(world_)), sizeof(T),
227 &value);
228
229 return *this;
230}
231
233template <typename Elem>
235 int32_t elem_count)
236{
237 ecs_array_desc_t desc = {};
238 desc.entity = id_;
239 desc.type = _::type<Elem>::id(world_);
240 desc.count = elem_count;
241 ecs_array_init(world_, &desc);
242 return *this;
243}
244
247 double min,
248 double max)
249{
250 const flecs::member_t *m = ecs_cpp_last_member(world_, id_);
251 if (!m) {
252 return *this;
253 }
254
255 flecs::world w(world_);
256 flecs::entity me = w.entity(m->member);
257
258 // Don't use C++ ensure because Unreal defines a macro called ensure
259 flecs::MemberRanges *mr = static_cast<flecs::MemberRanges*>(
261 mr->value.min = min;
262 mr->value.max = max;
264 return *this;
265}
266
269 double min,
270 double max)
271{
272 const flecs::member_t *m = ecs_cpp_last_member(world_, id_);
273 if (!m) {
274 return *this;
275 }
276
277 flecs::world w(world_);
278 flecs::entity me = w.entity(m->member);
279
280 // Don't use C++ ensure because Unreal defines a macro called ensure
281 flecs::MemberRanges *mr = static_cast<flecs::MemberRanges*>(
283 mr->warning.min = min;
284 mr->warning.max = max;
286 return *this;
287}
288
291 double min,
292 double max)
293{
294 const flecs::member_t *m = ecs_cpp_last_member(world_, id_);
295 if (!m) {
296 return *this;
297 }
298
299 flecs::world w(world_);
300 flecs::entity me = w.entity(m->member);
301
302 // Don't use C++ ensure because Unreal defines a macro called ensure
304 w, me, w.id<flecs::MemberRanges>()));
305 mr->error.min = min;
306 mr->error.max = max;
308 return *this;
309}
310
void ecs_add_id(ecs_world_t *world, ecs_entity_t entity, ecs_id_t id)
Add a (component) id to an entity.
#define ecs_assert(condition, error_code,...)
Assert.
Definition log.h:368
FLECS_API ecs_entity_t ecs_array_init(ecs_world_t *world, const ecs_array_desc_t *desc)
Create a new array type.
ecs_id_t ecs_entity_t
An entity identifier.
Definition flecs.h:375
untyped_component & member(const char *name, int32_t count, size_t offset)
Add member with unit.
untyped_component & member(const char *name, int32_t count=0)
Add member.
untyped_component & member(flecs::entity_t unit, const char *name, int32_t count, size_t offset)
Add member with unit.
untyped_component & member(const char *name, int32_t count=0)
Add member with unit.
untyped_component & member(flecs::entity_t type_id, flecs::entity_t unit, const char *name, int32_t count=0)
Add member with unit.
untyped_component & member(flecs::entity_t unit, const char *name, const MemberType ComponentType::*ptr)
Add member with unit using pointer-to-member.
untyped_component & warning_range(double min, double max)
Add member warning range.
untyped_component & member(flecs::entity_t unit, const char *name, int32_t count=0)
Add member with unit.
untyped_component & constant(const char *name, T value)
Add constant.
untyped_component & member(flecs::entity_t type_id, flecs::entity_t unit, const char *name, int32_t count, size_t offset)
Add member with unit, count and offset.
untyped_component & member(flecs::entity_t type_id, const char *name, int32_t count, size_t offset)
Add member with count and offset.
untyped_component & array(int32_t elem_count)
Register array metadata for component.
untyped_component & bit(const char *name, T value)
Add bitmask constant.
untyped_component & range(double min, double max)
Add member value range.
untyped_component & member(const char *name, const MemberType ComponentType::*ptr)
Add member using pointer-to-member.
untyped_component & member(flecs::entity_t type_id, const char *name, int32_t count=0)
Add member.
untyped_component & member(const char *name, const MemberType ComponentType::*ptr)
Add member with unit using pointer-to-member.
untyped_component & member(const char *name, int32_t count, size_t offset)
Add member.
untyped_component & error_range(double min, double max)
Add member error range.
flecs::entity entity(Args &&... args) const
Create an entity.
flecs::id id(E value) const
Convert enum constant to entity.
ecs_entity_t ecs_entity_init(ecs_world_t *world, const ecs_entity_desc_t *desc)
Find or create an entity.
void * ecs_ensure_id(ecs_world_t *world, ecs_entity_t entity, ecs_id_t id)
Get a mutable pointer to a component.
void ecs_set_id(ecs_world_t *world, ecs_entity_t entity, ecs_id_t id, size_t size, const void *ptr)
Set the value of a component.
Component added to member entities to express valid value ranges.
Definition meta.h:214
ecs_member_value_range_t warning
Member value warning range.
Definition meta.h:216
ecs_member_value_range_t value
Member value range.
Definition meta.h:215
ecs_member_value_range_t error
Member value error range.
Definition meta.h:217
ecs_entity_t type
Member type.
Definition meta.h:200
Used with ecs_array_init().
Definition meta.h:1004
ecs_entity_t entity
Existing entity to use for type (optional).
Definition meta.h:1005
ecs_entity_t type
Element type.
Definition meta.h:1006
int32_t count
Number of elements.
Definition meta.h:1007
Used with ecs_entity_init().
Definition flecs.h:1004
const char * name
Name of the entity.
Definition flecs.h:1011
ecs_entity_t parent
Parent entity.
Definition flecs.h:1009
Element type of members vector in EcsStruct.
Definition meta.h:221
ecs_entity_t member
Should not be set by ecs_struct_desc_t.
Definition meta.h:260
double min
Min member value.
Definition meta.h:209
double max
Max member value.
Definition meta.h:210
Entity.
Definition entity.hpp:30
void modified() const
Signal that component was modified.
Definition entity.hpp:209
Untyped component class.
The world.
Definition world.hpp:137