Flecs v4.0
A fast entity component system (ECS) for C & C++
Loading...
Searching...
No Matches
world.hpp
Go to the documentation of this file.
1
6#pragma once
7
8namespace flecs
9{
10
11/* Static helper functions to assign a component value */
12
13// set(T&&), T = constructible
14template <typename T, if_t< is_flecs_constructible<T>::value > = 0>
15inline void set(world_t *world, flecs::entity_t entity, T&& value, flecs::id_t id) {
16 ecs_assert(_::type<T>::size() != 0, ECS_INVALID_PARAMETER,
17 "operation invalid for empty type");
18
19 if (!ecs_is_deferred(world)) {
20 T& dst = *static_cast<T*>(ecs_ensure_id(world, entity, id));
21 dst = FLECS_MOV(value);
22
23 ecs_modified_id(world, entity, id);
24 } else {
25 T& dst = *static_cast<T*>(ecs_ensure_modified_id(world, entity, id));
26 dst = FLECS_MOV(value);
27 }
28}
29
30// set(const T&), T = constructible
31template <typename T, if_t< is_flecs_constructible<T>::value > = 0>
32inline void set(world_t *world, flecs::entity_t entity, const T& value, flecs::id_t id) {
33 ecs_assert(_::type<T>::size() != 0, ECS_INVALID_PARAMETER,
34 "operation invalid for empty type");
35
36 if (!ecs_is_deferred(world)) {
37 T& dst = *static_cast<T*>(ecs_ensure_id(world, entity, id));
38 dst = FLECS_MOV(value);
39
40 ecs_modified_id(world, entity, id);
41 } else {
42 T& dst = *static_cast<T*>(ecs_ensure_modified_id(world, entity, id));
43 dst = FLECS_MOV(value);
44 }
45}
46
47// set(T&&), T = not constructible
48template <typename T, if_not_t< is_flecs_constructible<T>::value > = 0>
49inline void set(world_t *world, flecs::entity_t entity, T&& value, flecs::id_t id) {
50 ecs_assert(_::type<T>::size() != 0, ECS_INVALID_PARAMETER,
51 "operation invalid for empty type");
52
53 if (!ecs_is_deferred(world)) {
54 T& dst = *static_cast<remove_reference_t<T>*>(ecs_ensure_id(world, entity, id));
55 dst = FLECS_MOV(value);
56
57 ecs_modified_id(world, entity, id);
58 } else {
59 T& dst = *static_cast<remove_reference_t<T>*>(ecs_ensure_modified_id(world, entity, id));
60 dst = FLECS_MOV(value);
61 }
62}
63
64// set(const T&), T = not constructible
65template <typename T, if_not_t< is_flecs_constructible<T>::value > = 0>
66inline void set(world_t *world, flecs::entity_t entity, const T& value, flecs::id_t id) {
67 ecs_assert(_::type<T>::size() != 0, ECS_INVALID_PARAMETER,
68 "operation invalid for empty type");
69
70 if (!ecs_is_deferred(world)) {
71 T& dst = *static_cast<remove_reference_t<T>*>(ecs_ensure_id(world, entity, id));
72 dst = FLECS_MOV(value);
73
74 ecs_modified_id(world, entity, id);
75 } else {
76 T& dst = *static_cast<remove_reference_t<T>*>(ecs_ensure_modified_id(world, entity, id));
77 dst = FLECS_MOV(value);
78 }
79}
80
81// emplace for T(Args...)
82template <typename T, typename ... Args, if_t<
83 std::is_constructible<actual_type_t<T>, Args...>::value ||
84 std::is_default_constructible<actual_type_t<T>>::value > = 0>
85inline void emplace(world_t *world, flecs::entity_t entity, flecs::id_t id, Args&&... args) {
86 ecs_assert(_::type<T>::size() != 0, ECS_INVALID_PARAMETER,
87 "operation invalid for empty type");
88 T& dst = *static_cast<T*>(ecs_emplace_id(world, entity, id, nullptr));
89
90 FLECS_PLACEMENT_NEW(&dst, T{FLECS_FWD(args)...});
91
92 ecs_modified_id(world, entity, id);
93}
94
95// set(T&&)
96template <typename T, typename A>
97inline void set(world_t *world, entity_t entity, A&& value) {
98 id_t id = _::type<T>::id(world);
99 flecs::set(world, entity, FLECS_FWD(value), id);
100}
101
102// set(const T&)
103template <typename T, typename A>
104inline void set(world_t *world, entity_t entity, const A& value) {
105 id_t id = _::type<T>::id(world);
106 flecs::set(world, entity, value, id);
107}
108
113inline flecs::id_t strip_generation(flecs::entity_t e) {
114 return ecs_strip_generation(e);
115}
116
119inline uint32_t get_generation(flecs::entity_t e) {
120 return ECS_GENERATION(e);
121}
122
123struct scoped_world;
124
137struct world {
140 explicit world()
141 : world_( ecs_init() ) {
142 init_builtin_components();
143 }
144
149 explicit world(int argc, char *argv[])
150 : world_( ecs_init_w_args(argc, argv) ) {
151 init_builtin_components();
152 }
153
156 explicit world(world_t *w)
157 : world_( w ) {
158 if (w) {
159 flecs_poly_claim(w);
160 }
161 }
162
165 world(const world& obj) {
166 this->world_ = obj.world_;
167 flecs_poly_claim(this->world_);
168 }
169
170 world& operator=(const world& obj) noexcept {
171 release();
172 this->world_ = obj.world_;
173 flecs_poly_claim(this->world_);
174 return *this;
175 }
176
177 world(world&& obj) noexcept {
178 world_ = obj.world_;
179 obj.world_ = nullptr;
180 }
181
182 world& operator=(world&& obj) noexcept {
183 release();
184 world_ = obj.world_;
185 obj.world_ = nullptr;
186 return *this;
187 }
188
189 /* Releases the underlying world object. If this is the last handle, the world
190 will be finalized. */
191 void release() {
192 if (world_) {
193 if (!flecs_poly_release(world_)) {
194 if (ecs_stage_get_id(world_) == -1) {
195 ecs_stage_free(world_);
196 } else {
197 // before we call ecs_fini(), we increment the reference count back to 1
198 // otherwise, copies of this object created during ecs_fini (e.g. a component on_remove hook)
199 // would call again this destructor and ecs_fini().
200 flecs_poly_claim(world_);
201 ecs_fini(world_);
202 }
203 }
204 world_ = nullptr;
205 }
206 }
207
208 ~world() {
209 release();
210 }
211
212 /* Implicit conversion to world_t* */
213 operator world_t*() const { return world_; }
214
222 void make_owner() {
223 flecs_poly_release(world_);
224 }
225
227 void reset() {
228 /* Make sure there's only one reference to the world */
229 ecs_assert(flecs_poly_refcount(world_) == 1, ECS_INVALID_OPERATION,
230 "reset would invalidate other handles");
231 ecs_fini(world_);
232 world_ = ecs_init();
233 }
234
237 world_t* c_ptr() const {
238 return world_;
239 }
240
244 void quit() const {
245 ecs_quit(world_);
246 }
247
250 void atfini(ecs_fini_action_t action, void *ctx = nullptr) const {
251 ecs_atfini(world_, action, ctx);
252 }
253
256 bool should_quit() const {
257 return ecs_should_quit(world_);
258 }
259
282 return ecs_frame_begin(world_, delta_time);
283 }
284
294 void frame_end() const {
295 ecs_frame_end(world_);
296 }
297
308 bool readonly_begin(bool multi_threaded = false) const {
309 return ecs_readonly_begin(world_, multi_threaded);
310 }
311
318 void readonly_end() const {
319 ecs_readonly_end(world_);
320 }
321
337 bool defer_begin() const {
338 return ecs_defer_begin(world_);
339 }
340
355 bool defer_end() const {
356 return ecs_defer_end(world_);
357 }
358
370 bool is_deferred() const {
371 return ecs_is_deferred(world_);
372 }
373
389 void set_stage_count(int32_t stages) const {
390 ecs_set_stage_count(world_, stages);
391 }
392
401 int32_t get_stage_count() const {
402 return ecs_get_stage_count(world_);
403 }
404
411 int32_t get_stage_id() const {
412 return ecs_stage_get_id(world_);
413 }
414
421 bool is_stage() const {
423 flecs_poly_is(world_, ecs_world_t) ||
424 flecs_poly_is(world_, ecs_stage_t),
425 ECS_INVALID_PARAMETER,
426 "flecs::world instance contains invalid reference to world or stage");
427 return flecs_poly_is(world_, ecs_stage_t);
428 }
429
440 void merge() const {
441 ecs_merge(world_);
442 }
443
458 flecs::world get_stage(int32_t stage_id) const {
459 return flecs::world(ecs_get_stage(world_, stage_id));
460 }
461
478 ecs_world_t *as = ecs_stage_new(world_);
479 flecs_poly_release(as); // world object will claim
480 return flecs::world(as);
481 }
482
490 /* Safe cast, mutability is checked */
491 return flecs::world(
492 world_ ? const_cast<flecs::world_t*>(ecs_get_world(world_)) : nullptr);
493 }
494
505 bool is_readonly() const {
506 return ecs_stage_is_readonly(world_);
507 }
508
520 void set_ctx(void* ctx, ecs_ctx_free_t ctx_free = nullptr) const {
521 ecs_set_ctx(world_, ctx, ctx_free);
522 }
523
533 void* get_ctx() const {
534 return ecs_get_ctx(world_);
535 }
536
548 void set_binding_ctx(void* ctx, ecs_ctx_free_t ctx_free = nullptr) const {
549 ecs_set_binding_ctx(world_, ctx, ctx_free);
550 }
551
561 void* get_binding_ctx() const {
562 return ecs_get_binding_ctx(world_);
563 }
564
572 void dim(int32_t entity_count) const {
573 ecs_dim(world_, entity_count);
574 }
575
584 void set_entity_range(entity_t min, entity_t max) const {
585 ecs_set_entity_range(world_, min, max);
586 }
587
598 void enable_range_check(bool enabled = true) const {
599 ecs_enable_range_check(world_, enabled);
600 }
601
610 flecs::entity set_scope(const flecs::entity_t scope) const;
611
619 flecs::entity get_scope() const;
620
626 template <typename T>
627 flecs::entity set_scope() const;
628
634 flecs::entity_t* set_lookup_path(const flecs::entity_t *search_path) const {
635 return ecs_set_lookup_path(world_, search_path);
636 }
637
644 flecs::entity lookup(const char *name, const char *sep = "::", const char *root_sep = "::", bool recursive = true) const;
645
648 template <typename T, if_t< !is_callable<T>::value > = 0>
649 void set(const T& value) const {
650 flecs::set<T>(world_, _::type<T>::id(world_), value);
651 }
652
655 template <typename T, if_t< !is_callable<T>::value > = 0>
656 void set(T&& value) const {
657 flecs::set<T>(world_, _::type<T>::id(world_),
658 FLECS_FWD(value));
659 }
660
663 template <typename First, typename Second, typename P = flecs::pair<First, Second>,
664 typename A = actual_type_t<P>, if_not_t< flecs::is_pair<First>::value> = 0>
665 void set(const A& value) const {
666 flecs::set<P>(world_, _::type<First>::id(world_), value);
667 }
668
671 template <typename First, typename Second, typename P = flecs::pair<First, Second>,
672 typename A = actual_type_t<P>, if_not_t< flecs::is_pair<First>::value> = 0>
673 void set(A&& value) const {
674 flecs::set<P>(world_, _::type<First>::id(world_), FLECS_FWD(value));
675 }
676
679 template <typename First, typename Second>
680 void set(Second second, const First& value) const;
681
684 template <typename First, typename Second>
685 void set(Second second, First&& value) const;
686
689 template <typename Func, if_t< is_callable<Func>::value > = 0 >
690 void set(const Func& func) const;
691
692 template <typename T, typename ... Args>
693 void emplace(Args&&... args) const {
694 flecs::id_t component_id = _::type<T>::id(world_);
695 flecs::emplace<T>(world_, component_id, component_id, FLECS_FWD(args)...);
696 }
697
700 #ifndef ensure
701 template <typename T>
702 T& ensure() const;
703 #endif
704
707 template <typename T>
708 void modified() const;
709
712 template <typename T>
713 ref<T> get_ref() const;
714
715
716 /* try_get */
717
720 const void* try_get(flecs::id_t id) const;
721
724 const void* try_get(flecs::entity_t r, flecs::entity_t t) const;
725
728 template <typename T>
729 const T* try_get() const;
730
733 template <typename First, typename Second, typename P = flecs::pair<First, Second>,
734 typename A = actual_type_t<P>>
735 const A* try_get() const;
736
739 template <typename First, typename Second>
740 const First* try_get(Second second) const;
741
742
743 /* get */
744
747 const void* get(flecs::id_t id) const;
748
751 const void* get(flecs::entity_t r, flecs::entity_t t) const;
752
753 template <typename T>
754 const T& get() const;
755
758 template <typename First, typename Second, typename P = flecs::pair<First, Second>,
759 typename A = actual_type_t<P>>
760 const A& get() const;
761
764 template <typename First, typename Second>
765 const First& get(Second second) const;
766
769 template <typename Func, if_t< is_callable<Func>::value > = 0 >
770 void get(const Func& func) const;
771
772
773 /* try_get_mut */
774
777 void* try_get_mut(flecs::id_t id) const;
778
781 void* try_get_mut(flecs::entity_t r, flecs::entity_t t) const;
782
783 template <typename T>
784 T* try_get_mut() const;
785
788 template <typename First, typename Second, typename P = flecs::pair<First, Second>,
789 typename A = actual_type_t<P>>
790 A* try_get_mut() const;
791
794 template <typename First, typename Second>
795 First* try_get_mut(Second second) const;
796
797
798 /* get_mut */
799
802 void* get_mut(flecs::id_t id) const;
803
806 void* get_mut(flecs::entity_t r, flecs::entity_t t) const;
807
808 template <typename T>
809 T& get_mut() const;
810
813 template <typename First, typename Second, typename P = flecs::pair<First, Second>,
814 typename A = actual_type_t<P>>
815 A& get_mut() const;
816
819 template <typename First, typename Second>
820 First& get_mut(Second second) const;
821
822
825 template <typename T>
826 bool has() const;
827
833 template <typename First, typename Second>
834 bool has() const;
835
841 template <typename First>
842 bool has(flecs::id_t second) const;
843
849 bool has(flecs::id_t first, flecs::id_t second) const;
850
853 template <typename T>
854 void add() const;
855
861 template <typename First, typename Second>
862 void add() const;
863
869 template <typename First>
870 void add(flecs::entity_t second) const;
871
877 void add(flecs::entity_t first, flecs::entity_t second) const;
878
881 template <typename T>
882 void remove() const;
883
889 template <typename First, typename Second>
890 void remove() const;
891
897 template <typename First>
898 void remove(flecs::entity_t second) const;
899
905 void remove(flecs::entity_t first, flecs::entity_t second) const;
906
914 template <typename Func>
915 void children(Func&& f) const;
916
919 template <typename T>
920 flecs::entity singleton() const;
921
930 template<typename First>
931 flecs::entity target(int32_t index = 0) const;
932
941 template<typename T>
942 flecs::entity target(flecs::entity_t first, int32_t index = 0) const;
943
952 flecs::entity target(flecs::entity_t first, int32_t index = 0) const;
953
960 template <typename T>
961 flecs::entity use(const char *alias = nullptr) const;
962
968 flecs::entity use(const char *name, const char *alias = nullptr) const;
969
975 void use(flecs::entity entity, const char *alias = nullptr) const;
976
981 int count(flecs::id_t component_id) const {
982 return ecs_count_id(world_, component_id);
983 }
984
990 int count(flecs::entity_t first, flecs::entity_t second) const {
991 return ecs_count_id(world_, ecs_pair(first, second));
992 }
993
998 template <typename T>
999 int count() const {
1000 return count(_::type<T>::id(world_));
1001 }
1002
1008 template <typename First>
1009 int count(flecs::entity_t second) const {
1010 return count(_::type<First>::id(world_), second);
1011 }
1012
1018 template <typename First, typename Second>
1019 int count() const {
1020 return count(
1021 _::type<First>::id(world_),
1022 _::type<Second>::id(world_));
1023 }
1024
1027 template <typename Func>
1028 void with(id_t with_id, const Func& func) const {
1029 ecs_id_t prev = ecs_set_with(world_, with_id);
1030 func();
1031 ecs_set_with(world_, prev);
1032 }
1033
1036 template <typename T, typename Func>
1037 void with(const Func& func) const {
1038 with(this->id<T>(), func);
1039 }
1040
1043 template <typename First, typename Second, typename Func>
1044 void with(const Func& func) const {
1045 with(ecs_pair(this->id<First>(), this->id<Second>()), func);
1046 }
1047
1050 template <typename First, typename Func>
1051 void with(id_t second, const Func& func) const {
1052 with(ecs_pair(this->id<First>(), second), func);
1053 }
1054
1057 template <typename Func>
1058 void with(id_t first, id_t second, const Func& func) const {
1059 with(ecs_pair(first, second), func);
1060 }
1061
1065 template <typename Func>
1066 void scope(id_t parent, const Func& func) const {
1067 ecs_entity_t prev = ecs_set_scope(world_, parent);
1068 func();
1069 ecs_set_scope(world_, prev);
1070 }
1071
1074 template <typename T, typename Func>
1075 void scope(const Func& func) const {
1076 flecs::id_t parent = _::type<T>::id(world_);
1077 scope(parent, func);
1078 }
1079
1083 flecs::scoped_world scope(id_t parent) const;
1084
1085 template <typename T>
1086 flecs::scoped_world scope() const;
1087
1088 flecs::scoped_world scope(const char* name) const;
1089
1091 void delete_with(id_t the_id) const {
1092 ecs_delete_with(world_, the_id);
1093 }
1094
1096 void delete_with(entity_t first, entity_t second) const {
1097 delete_with(ecs_pair(first, second));
1098 }
1099
1101 template <typename T>
1102 void delete_with() const {
1103 delete_with(_::type<T>::id(world_));
1104 }
1105
1107 template <typename First, typename Second>
1108 void delete_with() const {
1110 }
1111
1113 template <typename First>
1114 void delete_with(entity_t second) const {
1115 delete_with(_::type<First>::id(world_), second);
1116 }
1117
1119 void remove_all(id_t the_id) const {
1120 ecs_remove_all(world_, the_id);
1121 }
1122
1124 void remove_all(entity_t first, entity_t second) const {
1125 remove_all(ecs_pair(first, second));
1126 }
1127
1129 template <typename T>
1130 void remove_all() const {
1131 remove_all(_::type<T>::id(world_));
1132 }
1133
1135 template <typename First, typename Second>
1136 void remove_all() const {
1138 }
1139
1141 template <typename First>
1142 void remove_all(entity_t second) const {
1143 remove_all(_::type<First>::id(world_), second);
1144 }
1145
1154 template <typename Func>
1155 void defer(const Func& func) const {
1156 ecs_defer_begin(world_);
1157 func();
1158 ecs_defer_end(world_);
1159 }
1160
1170 void defer_suspend() const {
1171 ecs_defer_suspend(world_);
1172 }
1173
1183 void defer_resume() const {
1184 ecs_defer_resume(world_);
1185 }
1186
1193 bool exists(flecs::entity_t e) const {
1194 return ecs_exists(world_, e);
1195 }
1196
1203 bool is_alive(flecs::entity_t e) const {
1204 return ecs_is_alive(world_, e);
1205 }
1206
1214 bool is_valid(flecs::entity_t e) const {
1215 return ecs_is_valid(world_, e);
1216 }
1217
1223 flecs::entity get_alive(flecs::entity_t e) const;
1224
1228 flecs::entity make_alive(flecs::entity_t e) const;
1229
1234 void set_version(flecs::entity_t e) const {
1235 ecs_set_version(world_, e);
1236 }
1237
1238 /* Run callback after completing frame */
1239 void run_post_frame(ecs_fini_action_t action, void *ctx) const {
1240 ecs_run_post_frame(world_, action, ctx);
1241 }
1242
1248 return ecs_get_world_info(world_);
1249 }
1250
1253 return get_info()->delta_time;
1254 }
1255
1260 void shrink() const {
1261 ecs_shrink(world_);
1262 }
1263
1269 void exclusive_access_begin(const char *thread_name = nullptr) {
1270 ecs_exclusive_access_begin(world_, thread_name);
1271 }
1272
1278 void exclusive_access_end(bool lock_world = false) {
1279 ecs_exclusive_access_end(world_, lock_world);
1280 }
1281
1282# include "mixins/id/mixin.inl"
1284# include "mixins/entity/mixin.inl"
1285# include "mixins/event/mixin.inl"
1286# include "mixins/term/mixin.inl"
1287# include "mixins/observer/mixin.inl"
1288# include "mixins/query/mixin.inl"
1289# include "mixins/enum/mixin.inl"
1290
1291# ifdef FLECS_MODULE
1292# include "mixins/module/mixin.inl"
1293# endif
1294# ifdef FLECS_PIPELINE
1295# include "mixins/pipeline/mixin.inl"
1296# endif
1297# ifdef FLECS_SYSTEM
1298# include "mixins/system/mixin.inl"
1299# endif
1300# ifdef FLECS_TIMER
1301# include "mixins/timer/mixin.inl"
1302# endif
1303# ifdef FLECS_SCRIPT
1304# include "mixins/script/mixin.inl"
1305# endif
1306# ifdef FLECS_META
1307# include "mixins/meta/world.inl"
1308# endif
1309# ifdef FLECS_JSON
1310# include "mixins/json/world.inl"
1311# endif
1312# ifdef FLECS_APP
1313# include "mixins/app/mixin.inl"
1314# endif
1315# ifdef FLECS_METRICS
1316# include "mixins/metrics/mixin.inl"
1317# endif
1318# ifdef FLECS_ALERTS
1319# include "mixins/alerts/mixin.inl"
1320# endif
1321
1322public:
1323 void init_builtin_components();
1324
1325 world_t *world_;
1326};
1327
1333 flecs::world_t *w,
1334 flecs::entity_t s) : world(w)
1335 {
1336 prev_scope_ = ecs_set_scope(w, s);
1337 }
1338
1339 ~scoped_world() {
1340 ecs_set_scope(world_, prev_scope_);
1341 }
1342
1343 scoped_world(const scoped_world& obj) : world(nullptr) {
1344 prev_scope_ = obj.prev_scope_;
1345 world_ = obj.world_;
1346 flecs_poly_claim(world_);
1347 }
1348
1349 flecs::entity_t prev_scope_;
1350};
1351
1354} // namespace flecs
App world addon mixin.
Component mixin.
Entity world mixin.
Enum world mixin.
Event world mixin.
ecs_entity_t ecs_set_with(ecs_world_t *world, ecs_id_t id)
Set current with id.
void ecs_remove_all(ecs_world_t *world, ecs_id_t id)
Remove all instances of the specified (component) id.
#define ecs_assert(condition, error_code,...)
Assert.
Definition log.h:368
ecs_world_t * ecs_stage_new(ecs_world_t *world)
Create unmanaged stage.
bool ecs_defer_end(ecs_world_t *world)
End block of operations to defer.
bool ecs_readonly_begin(ecs_world_t *world, bool multi_threaded)
Begin readonly mode.
void ecs_defer_resume(ecs_world_t *world)
Resume deferring.
bool ecs_defer_begin(ecs_world_t *world)
Defer operations until end of frame.
void ecs_defer_suspend(ecs_world_t *world)
Suspend deferring but do not flush queue.
bool ecs_is_deferred(const ecs_world_t *world)
Test if deferring is enabled for current stage.
void ecs_stage_free(ecs_world_t *stage)
Free unmanaged stage.
void ecs_merge(ecs_world_t *world)
Merge world or stage.
int32_t ecs_stage_get_id(const ecs_world_t *world)
Get stage id.
bool ecs_stage_is_readonly(const ecs_world_t *world)
Test whether the current world is readonly.
int32_t ecs_get_stage_count(const ecs_world_t *world)
Get number of configured stages.
ecs_world_t * ecs_get_stage(const ecs_world_t *world, int32_t stage_id)
Get stage-specific world pointer.
void ecs_set_stage_count(ecs_world_t *world, int32_t stages)
Configure world to have N stages.
void ecs_readonly_end(ecs_world_t *world)
End readonly mode.
struct ecs_stage_t ecs_stage_t
A stage enables modification while iterating and from multiple threads.
Definition flecs.h:428
ecs_id_t ecs_entity_t
An entity identifier.
Definition flecs.h:381
struct ecs_world_t ecs_world_t
A world is the container for all ECS data and supporting features.
Definition flecs.h:425
uint64_t ecs_id_t
Ids are the things that can be added to an entity.
Definition flecs.h:374
flecs::entity entity(Args &&... args) const
Create an entity.
void ecs_delete_with(ecs_world_t *world, ecs_id_t id)
Delete all entities with the specified id.
int32_t ecs_count_id(const ecs_world_t *world, ecs_id_t entity)
Count entities that have the specified id.
void(* ecs_fini_action_t)(ecs_world_t *world, void *ctx)
Action callback on world exit.
Definition flecs.h:619
void(* ecs_ctx_free_t)(void *ctx)
Function to cleanup context data.
Definition flecs.h:624
void * ecs_emplace_id(ecs_world_t *world, ecs_entity_t entity, ecs_id_t id, bool *is_new)
Emplace a component.
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_ensure_modified_id(ecs_world_t *world, ecs_entity_t entity, ecs_id_t id)
Combines ensure + modified in single operation.
void ecs_modified_id(ecs_world_t *world, ecs_entity_t entity, ecs_id_t id)
Signal that a component has been modified.
ecs_id_t ecs_strip_generation(ecs_entity_t e)
Remove generation from entity id.
bool ecs_is_valid(const ecs_world_t *world, ecs_entity_t e)
Test whether an entity is valid.
bool ecs_exists(const ecs_world_t *world, ecs_entity_t entity)
Test whether an entity exists.
bool ecs_is_alive(const ecs_world_t *world, ecs_entity_t e)
Test whether an entity is alive.
void ecs_set_version(ecs_world_t *world, ecs_entity_t entity)
Override the generation of an entity.
#define ecs_ftime_t
Customizable precision for scalar time values.
Definition flecs.h:59
ecs_entity_t * ecs_set_lookup_path(ecs_world_t *world, const ecs_entity_t *lookup_path)
Set search path for lookup operations.
ecs_entity_t ecs_set_scope(ecs_world_t *world, ecs_entity_t scope)
Set the current scope.
void ecs_atfini(ecs_world_t *world, ecs_fini_action_t action, void *ctx)
Register action to be executed when world is destroyed.
int ecs_fini(ecs_world_t *world)
Delete a world.
ecs_world_t * ecs_init(void)
Create a new world.
ecs_world_t * ecs_init_w_args(int argc, char *argv[])
Create a new world with arguments.
float ecs_frame_begin(ecs_world_t *world, float delta_time)
Begin frame.
void ecs_run_post_frame(ecs_world_t *world, ecs_fini_action_t action, void *ctx)
Register action to be executed once after frame.
bool ecs_should_quit(const ecs_world_t *world)
Return whether a quit has been requested.
void ecs_quit(ecs_world_t *world)
Signal exit This operation signals that the application should quit.
void ecs_frame_end(ecs_world_t *world)
End frame.
void * ecs_get_binding_ctx(const ecs_world_t *world)
Get the world binding context.
void ecs_shrink(ecs_world_t *world)
Free unused memory.
void ecs_dim(ecs_world_t *world, int32_t entity_count)
Dimension the world for a specified number of entities.
void ecs_set_entity_range(ecs_world_t *world, ecs_entity_t id_start, ecs_entity_t id_end)
Set a range for issuing new entity ids.
const ecs_world_info_t * ecs_get_world_info(const ecs_world_t *world)
Get world info.
const ecs_world_t * ecs_get_world(const ecs_poly_t *poly)
Get world from poly.
void ecs_set_ctx(ecs_world_t *world, void *ctx, ecs_ctx_free_t ctx_free)
Set a world context.
void ecs_exclusive_access_begin(ecs_world_t *world, const char *thread_name)
Begin exclusive thread access.
void ecs_set_binding_ctx(ecs_world_t *world, void *ctx, ecs_ctx_free_t ctx_free)
Set a world binding context.
#define flecs_poly_is(object, type)
Test if pointer is of specified type.
Definition flecs.h:2729
bool ecs_enable_range_check(ecs_world_t *world, bool enable)
Enable/disable range limits.
void ecs_exclusive_access_end(ecs_world_t *world, bool lock_world)
End exclusive thread access.
void * ecs_get_ctx(const ecs_world_t *world)
Get the world context.
Id world mixin.
JSON world mixin.
Meta world mixin.
Module world mixin.
Observer world mixin.
Pipeline world mixin.
Query world mixin.
Script world mixin.
Type that contains information about the world.
Definition flecs.h:1448
float delta_time
Time passed to or computed by ecs_progress()
Definition flecs.h:1454
Entity.
Definition entity.hpp:30
Class that wraps around a flecs::id_t.
Definition decl.hpp:27
Scoped world.
Definition world.hpp:1331
The world.
Definition world.hpp:137
bool is_stage() const
Test if is a stage.
Definition world.hpp:421
void shrink() const
Free unused memory.
Definition world.hpp:1260
void delete_with() const
Delete all entities with specified component.
Definition world.hpp:1102
void remove_all(id_t the_id) const
Remove all instances of specified id.
Definition world.hpp:1119
void delete_with(entity_t second) const
Delete all entities with specified pair.
Definition world.hpp:1114
void merge() const
Merge world or stage.
Definition world.hpp:440
void delete_with(id_t the_id) const
Delete all entities with specified id.
Definition world.hpp:1091
const flecs::world_info_t * get_info() const
Get the world info.
Definition world.hpp:1247
flecs::entity get_scope() const
Get current scope.
Definition world.hpp:81
void remove() const
Remove singleton component.
Definition world.hpp:286
flecs::entity lookup(const char *name, const char *sep="::", const char *root_sep="::", bool recursive=true) const
Lookup entity by name.
Definition world.hpp:90
void set(A &&value) const
Set singleton pair.
Definition world.hpp:673
ecs_ftime_t delta_time() const
Get delta_time.
Definition world.hpp:1252
void quit() const
Signal application should quit.
Definition world.hpp:244
flecs::entity get_alive(flecs::entity_t e) const
Get alive entity for id.
Definition world.hpp:356
void set_entity_range(entity_t min, entity_t max) const
Set entity range.
Definition world.hpp:584
void readonly_end() const
End readonly mode.
Definition world.hpp:318
void with(const Func &func) const
All entities created in function are created with pair.
Definition world.hpp:1044
flecs::entity make_alive(flecs::entity_t e) const
Definition world.hpp:361
int count() const
Count entities matching a component.
Definition world.hpp:999
void exclusive_access_begin(const char *thread_name=nullptr)
Begin exclusive access.
Definition world.hpp:1269
flecs::entity target(int32_t index=0) const
Get target for a given pair from a singleton entity.
Definition world.hpp:319
void defer(const Func &func) const
Defer all operations called in function.
Definition world.hpp:1155
bool should_quit() const
Test if quit() has been called.
Definition world.hpp:256
bool is_alive(flecs::entity_t e) const
Check if entity id exists in the world.
Definition world.hpp:1203
world_t * c_ptr() const
Obtain pointer to C world object.
Definition world.hpp:237
const T * try_get() const
Get singleton component.
Definition world.hpp:138
bool defer_begin() const
Defer operations until end of frame.
Definition world.hpp:337
void reset()
Deletes and recreates the world.
Definition world.hpp:227
flecs::entity_t * set_lookup_path(const flecs::entity_t *search_path) const
Set search path.
Definition world.hpp:634
void defer_suspend() const
Suspend deferring operations.
Definition world.hpp:1170
void set(const A &value) const
Set singleton pair.
Definition world.hpp:665
void make_owner()
Make current world object owner of the world.
Definition world.hpp:222
bool is_valid(flecs::entity_t e) const
Check if entity id is valid.
Definition world.hpp:1214
flecs::world async_stage() const
Create asynchronous stage.
Definition world.hpp:477
bool is_deferred() const
Test whether deferring is enabled.
Definition world.hpp:370
void * get_binding_ctx() const
Get world binding context.
Definition world.hpp:561
int32_t get_stage_id() const
Get current stage id.
Definition world.hpp:411
world(const world &obj)
Not allowed to copy a world.
Definition world.hpp:165
void scope(const Func &func) const
Same as scope(parent, func), but with T as parent.
Definition world.hpp:1075
void defer_resume() const
Resume deferring operations.
Definition world.hpp:1183
flecs::entity set_scope() const
Same as set_scope but with type.
Definition world.hpp:86
void dim(int32_t entity_count) const
Preallocate memory for number of entities.
Definition world.hpp:572
void set_version(flecs::entity_t e) const
Set version of entity to provided.
Definition world.hpp:1234
void set_stage_count(int32_t stages) const
Configure world to have N stages.
Definition world.hpp:389
void with(id_t with_id, const Func &func) const
All entities created in function are created with id.
Definition world.hpp:1028
void * get_ctx() const
Get world context.
Definition world.hpp:533
int count() const
Count entities matching a pair.
Definition world.hpp:1019
void remove_all() const
Remove all instances of specified pair.
Definition world.hpp:1136
bool defer_end() const
End block of operations to defer.
Definition world.hpp:355
int count(flecs::entity_t first, flecs::entity_t second) const
Count entities matching a pair.
Definition world.hpp:990
void remove_all(entity_t second) const
Remove all instances of specified pair.
Definition world.hpp:1142
world(world_t *w)
Create world from C world.
Definition world.hpp:156
void children(Func &&f) const
Iterate entities in root of world Accepts a callback with the following signature:
Definition world.hpp:309
flecs::world get_world() const
Get actual world.
Definition world.hpp:489
void scope(id_t parent, const Func &func) const
All entities created in function are created in scope.
Definition world.hpp:1066
void with(const Func &func) const
All entities created in function are created with type.
Definition world.hpp:1037
void remove_all(entity_t first, entity_t second) const
Remove all instances of specified pair.
Definition world.hpp:1124
void modified() const
Mark singleton component as modified.
Definition world.hpp:104
void enable_range_check(bool enabled=true) const
Enforce that operations cannot modify entities outside of range.
Definition world.hpp:598
int count(flecs::entity_t second) const
Count entities matching a pair.
Definition world.hpp:1009
ecs_ftime_t frame_begin(float delta_time=0) const
Begin frame.
Definition world.hpp:281
flecs::entity use(const char *alias=nullptr) const
Create alias for component.
Definition world.hpp:48
bool is_readonly() const
Test whether the current world object is readonly.
Definition world.hpp:505
void add() const
Add singleton component.
Definition world.hpp:263
T & ensure() const
Ensure singleton component.
Definition world.hpp:97
bool readonly_begin(bool multi_threaded=false) const
Begin readonly mode.
Definition world.hpp:308
void set(const T &value) const
Set singleton component.
Definition world.hpp:649
void with(id_t first, id_t second, const Func &func) const
All entities created in function are created with pair.
Definition world.hpp:1058
flecs::world get_stage(int32_t stage_id) const
Get stage-specific world pointer.
Definition world.hpp:458
void set(T &&value) const
Set singleton component.
Definition world.hpp:656
bool has() const
Test if world has singleton component.
Definition world.hpp:240
bool exists(flecs::entity_t e) const
Check if entity id exists in the world.
Definition world.hpp:1193
world()
Create world.
Definition world.hpp:140
void frame_end() const
End frame.
Definition world.hpp:294
void set_binding_ctx(void *ctx, ecs_ctx_free_t ctx_free=nullptr) const
Set world binding context.
Definition world.hpp:548
void atfini(ecs_fini_action_t action, void *ctx=nullptr) const
Register action to be executed when world is destroyed.
Definition world.hpp:250
int32_t get_stage_count() const
Get number of configured stages.
Definition world.hpp:401
void delete_with(entity_t first, entity_t second) const
Delete all entities with specified pair.
Definition world.hpp:1096
void delete_with() const
Delete all entities with specified pair.
Definition world.hpp:1108
flecs::entity singleton() const
Get singleton entity for type.
Definition world.hpp:314
void exclusive_access_end(bool lock_world=false)
End exclusive access.
Definition world.hpp:1278
void with(id_t second, const Func &func) const
All entities created in function are created with pair.
Definition world.hpp:1051
void set_ctx(void *ctx, ecs_ctx_free_t ctx_free=nullptr) const
Set world context.
Definition world.hpp:520
world(int argc, char *argv[])
Create world with command line arguments.
Definition world.hpp:149
int count(flecs::id_t component_id) const
Count entities matching a component.
Definition world.hpp:981
void remove_all() const
Remove all instances of specified component.
Definition world.hpp:1130
ref< T > get_ref() const
Get ref singleton component.
Definition world.hpp:122
System module world mixin.
Term world mixin.
Timer module mixin.
flecs::id_t strip_generation(flecs::entity_t e)
Return id without generation.
Definition world.hpp:113
uint32_t get_generation(flecs::entity_t e)
Return entity generation.
Definition world.hpp:119