2#include "gaia/config/config.h"
8#include "gaia/ecs/api.h"
9#include "gaia/ecs/archetype.h"
10#include "gaia/ecs/chunk.h"
11#include "gaia/ecs/command_buffer_fwd.h"
12#include "gaia/ecs/component.h"
13#include "gaia/ecs/component_cache_item.h"
14#include "gaia/ecs/id.h"
15#include "gaia/ecs/query_common.h"
16#include "gaia/mem/data_layout_policy.h"
23 enum class Constraints : uint8_t { EnabledOnly, DisabledOnly, AcceptAll };
26 template <Constra
ints IterConstra
int>
54 void set_world(const
World* pWorld) {
55 GAIA_ASSERT(pWorld !=
nullptr);
59 GAIA_NODISCARD
World* world() {
64 GAIA_NODISCARD
const World* world()
const {
69 void set_archetype(
const Archetype* pArchetype) {
70 GAIA_ASSERT(pArchetype !=
nullptr);
79 GAIA_NODISCARD
const Archetype* archetype()
const {
84 void set_chunk(Chunk* pChunk) {
85 GAIA_ASSERT(pChunk !=
nullptr);
88 if constexpr (IterConstraint == Constraints::EnabledOnly)
93 if constexpr (IterConstraint == Constraints::DisabledOnly)
99 void set_chunk(Chunk* pChunk, uint16_t
from, uint16_t
to) {
100 if (
from == 0 &&
to == 0) {
105 GAIA_ASSERT(pChunk !=
nullptr);
111 GAIA_NODISCARD
const Chunk* chunk()
const {
116 void set_remapping_indices(
const uint8_t* pCompIndicesMapping) {
120 void set_group_id(GroupId groupId) {
124 GAIA_NODISCARD GroupId group_id()
const {
128 GAIA_NODISCARD CommandBufferST& cmd_buffer_st()
const {
129 auto* pWorld =
const_cast<World*
>(
m_pWorld);
130 return cmd_buffer_st_get(*pWorld);
133 GAIA_NODISCARD CommandBufferMT& cmd_buffer_mt()
const {
134 auto* pWorld =
const_cast<World*
>(
m_pWorld);
135 return cmd_buffer_mt_get(*pWorld);
142 template <
typename T>
143 GAIA_NODISCARD
auto view()
const {
147 template <
typename T>
148 GAIA_NODISCARD
auto view(uint32_t termIdx) {
149 using U =
typename actual_type_t<T>::Type;
152 GAIA_ASSERT(compIdx < m_pChunk->ids_view().
size());
154 if constexpr (mem::is_soa_layout_v<U>) {
155 auto* pData =
m_pChunk->comp_ptr_mut(compIdx);
167 template <
typename T>
172 template <
typename T>
173 GAIA_NODISCARD
auto view_mut(uint32_t termIdx) {
174 using U =
typename actual_type_t<T>::Type;
177 GAIA_ASSERT(compIdx < m_pChunk->comp_rec_view().
size());
181 if constexpr (mem::is_soa_layout_v<U>) {
182 auto* pData =
m_pChunk->comp_ptr_mut(compIdx);
195 template <
typename T>
200 template <
typename T>
201 GAIA_NODISCARD
auto sview_mut(uint32_t termIdx) {
202 using U =
typename actual_type_t<T>::Type;
205 GAIA_ASSERT(compIdx < m_pChunk->ids_view().
size());
207 if constexpr (mem::is_soa_layout_v<U>) {
208 auto* pData =
m_pChunk->comp_ptr_mut(compIdx);
219 template <
typename T,
bool TriggerHooks>
229 template <
typename T>
240 template <
typename T>
247 GAIA_NODISCARD
bool enabled(uint32_t index)
const {
248 const auto row = (uint16_t)(
from() + index);
269 template <
typename T>
270 GAIA_NODISCARD
bool has()
const {
274 GAIA_NODISCARD
static uint16_t start_index(
Chunk* pChunk)
noexcept {
275 if constexpr (IterConstraint == Constraints::EnabledOnly)
276 return pChunk->size_disabled();
281 GAIA_NODISCARD
static uint16_t end_index(
Chunk* pChunk)
noexcept {
282 if constexpr (IterConstraint == Constraints::DisabledOnly)
283 return pChunk->size_enabled();
285 return pChunk->size();
288 GAIA_NODISCARD
static uint16_t
size(Chunk* pChunk)
noexcept {
289 if constexpr (IterConstraint == Constraints::EnabledOnly)
290 return pChunk->size_enabled();
291 else if constexpr (IterConstraint == Constraints::DisabledOnly)
292 return pChunk->size_disabled();
294 return pChunk->size();
298 GAIA_NODISCARD uint16_t
size() const noexcept {
305 template <
typename T>
307 using U =
typename actual_type_t<T>::Type;
309 if constexpr (mem::is_soa_layout_v<U>)
317 GAIA_NODISCARD uint16_t
from() const noexcept {
322 GAIA_NODISCARD uint16_t
to() const noexcept {
376 void set_range(uint16_t from, uint16_t cnt) {
377 GAIA_ASSERT(from < m_pChunk->size());
378 GAIA_ASSERT(from + cnt <= m_pChunk->size());
383 void set_world(
const World* pWorld) {
384 GAIA_ASSERT(pWorld !=
nullptr);
388 GAIA_NODISCARD World* world() {
389 GAIA_ASSERT(m_pWorld !=
nullptr);
390 return const_cast<World*
>(m_pWorld);
393 GAIA_NODISCARD
const World* world()
const {
394 GAIA_ASSERT(m_pWorld !=
nullptr);
398 void set_archetype(
const Archetype* pArchetype) {
399 GAIA_ASSERT(pArchetype !=
nullptr);
400 m_pArchetype = pArchetype;
408 GAIA_NODISCARD
const Archetype* archetype()
const {
409 GAIA_ASSERT(m_pArchetype !=
nullptr);
413 void set_chunk(Chunk* pChunk) {
414 GAIA_ASSERT(pChunk !=
nullptr);
418 GAIA_NODISCARD
const Chunk* chunk()
const {
419 GAIA_ASSERT(m_pChunk !=
nullptr);
423 GAIA_NODISCARD CommandBufferST& cmd_buffer_st()
const {
424 auto* pWorld =
const_cast<World*
>(m_pWorld);
425 return cmd_buffer_st_get(*pWorld);
428 GAIA_NODISCARD CommandBufferMT& cmd_buffer_mt()
const {
429 auto* pWorld =
const_cast<World*
>(m_pWorld);
430 return cmd_buffer_mt_get(*pWorld);
437 template <
typename T>
438 GAIA_NODISCARD
auto view()
const {
439 return m_pChunk->
view<T>(from(), to());
446 template <
typename T>
448 return m_pChunk->
view_mut<T>(from(), to());
456 template <
typename T>
458 return m_pChunk->
sview_mut<T>(from(), to());
464 template <
typename T,
bool TriggerHooks>
466 m_pChunk->
modify<T, TriggerHooks>();
474 template <
typename T>
476 return m_pChunk->
view_auto<T>(from(), to());
485 template <
typename T>
492 GAIA_NODISCARD
bool enabled(uint32_t index)
const {
493 const auto row = (uint16_t)(from() + index);
501 return m_pChunk->
has(entity);
514 template <
typename T>
515 GAIA_NODISCARD
bool has()
const {
516 return m_pChunk->
has<T>();
520 GAIA_NODISCARD uint16_t
size() const noexcept {
526 GAIA_NODISCARD uint16_t from() const noexcept {
531 GAIA_NODISCARD uint16_t to() const noexcept {
532 return m_from + m_cnt;
Definition archetype.h:82
GAIA_NODISCARD decltype(auto) sview_auto(uint16_t from, uint16_t to)
Returns either a mutable or immutable entity/component view based on the requested type....
Definition chunk.h:692
GAIA_NODISCARD uint16_t capacity() const
Returns the number of entities in the chunk.
Definition chunk.h:1491
GAIA_FORCEINLINE void update_world_version(uint32_t compIdx)
Update the version of a component at the index.
Definition chunk.h:1518
GAIA_NODISCARD decltype(auto) view(uint16_t from, uint16_t to) const
Returns a read-only entity or component view.
Definition chunk.h:519
GAIA_NODISCARD uint16_t size_enabled() const
Return the number of entities in the chunk which are enabled.
Definition chunk.h:1481
GAIA_NODISCARD decltype(auto) view_auto(uint16_t from, uint16_t to)
Returns either a mutable or immutable entity/component view based on the requested type....
Definition chunk.h:670
GAIA_NODISCARD uint16_t size() const
Returns the total number of entities in the chunk (both enabled and disabled)
Definition chunk.h:1471
bool enabled(uint16_t row) const
Checks if the entity is enabled.
Definition chunk.h:1159
GAIA_NODISCARD uint16_t size_disabled() const
Return the number of entities in the chunk which are enabled.
Definition chunk.h:1486
GAIA_NODISCARD bool has(Entity entity) const
Checks if a component/entity entity is present in the chunk.
Definition chunk.h:1243
GAIA_NODISCARD decltype(auto) view_mut(uint16_t from, uint16_t to)
Returns a mutable entity or component view.
Definition chunk.h:547
GAIA_NODISCARD decltype(auto) sview_mut(uint16_t from, uint16_t to)
Returns a mutable component view. Doesn't update the world version when the access is acquired.
Definition chunk.h:579
GAIA_FORCEINLINE void modify()
Marks the component.
Definition chunk.h:613
Iterator used when copying entities.
Definition chunk_iterator.h:350
uint16_t m_from
Row of the first entity we iterate from.
Definition chunk_iterator.h:361
GAIA_NODISCARD auto view() const
Returns a read-only entity or component view.
Definition chunk_iterator.h:438
GAIA_NODISCARD auto sview_auto()
Returns either a mutable or immutable entity/component view based on the requested type....
Definition chunk_iterator.h:486
GAIA_NODISCARD auto sview_mut()
Returns a mutable component view. Doesn't update the world version when the access is acquired.
Definition chunk_iterator.h:457
GAIA_NODISCARD bool has() const
Checks if component T is present in the chunk.
Definition chunk_iterator.h:515
GAIA_NODISCARD auto view_mut()
Returns a mutable entity or component view.
Definition chunk_iterator.h:447
GAIA_NODISCARD bool has(Pair pair) const
Checks if relationship pair pair is present in the chunk.
Definition chunk_iterator.h:507
uint16_t m_cnt
The number of entities accessible via the iterator.
Definition chunk_iterator.h:363
GAIA_NODISCARD auto view_auto()
Returns either a mutable or immutable entity/component view based on the requested type....
Definition chunk_iterator.h:475
GAIA_NODISCARD bool has(Entity entity) const
Checks if entity entity is present in the chunk.
Definition chunk_iterator.h:500
void modify()
Marks the component T as modified. Best used with sview to manually trigger an update at user's whim....
Definition chunk_iterator.h:465
GAIA_NODISCARD uint16_t size() const noexcept
Returns the number of entities accessible via the iterator.
Definition chunk_iterator.h:520
GAIA_NODISCARD bool enabled(uint32_t index) const
Checks if the entity at the current iterator index is enabled.
Definition chunk_iterator.h:492
Iterator for iterating both enabled and disabled entities. Disabled entities always precede enabled o...
Definition chunk_iterator.h:335
GAIA_NODISCARD uint16_t size_disabled() const noexcept
Returns the number of disabled entities accessible via the iterator. Can be read also as "the index o...
Definition chunk_iterator.h:344
GAIA_NODISCARD uint16_t size_enabled() const noexcept
Returns the number of enabled entities accessible via the iterator.
Definition chunk_iterator.h:338
Iterator for iterating disabled entities.
Definition chunk_iterator.h:331
Iterator for iterating enabled entities.
Definition chunk_iterator.h:329
Definition chunk_iterator.h:27
GAIA_NODISCARD uint16_t to() const noexcept
Returns the ending index of the iterator (one past the last valid index)
Definition chunk_iterator.h:322
GAIA_NODISCARD auto sview_auto()
Returns either a mutable or immutable entity/component view based on the requested type....
Definition chunk_iterator.h:241
uint32_t acc_index(uint32_t idx) const noexcept
Returns the absolute index that should be used to access an item in the chunk. AoS indices map direct...
Definition chunk_iterator.h:306
Chunk * m_pChunk
Chunk currently associated with the iterator.
Definition chunk_iterator.h:36
GAIA_NODISCARD auto view() const
Returns a read-only entity or component view.
Definition chunk_iterator.h:143
GAIA_NODISCARD auto sview_mut()
Returns a mutable component view. Doesn't update the world version when the access is acquired.
Definition chunk_iterator.h:196
GAIA_NODISCARD uint16_t size() const noexcept
Returns the number of entities accessible via the iterator.
Definition chunk_iterator.h:298
const Archetype * m_pArchetype
Currently iterated archetype.
Definition chunk_iterator.h:34
const uint8_t * m_pCompIdxMapping
ChunkHeader::MAX_COMPONENTS values for component indices mapping for the parent archetype.
Definition chunk_iterator.h:38
void modify()
Marks the component T as modified. Best used with sview to manually trigger an update at user's whim....
Definition chunk_iterator.h:220
GAIA_NODISCARD bool enabled(uint32_t index) const
Checks if the entity at the current iterator index is enabled.
Definition chunk_iterator.h:247
const World * m_pWorld
World pointer.
Definition chunk_iterator.h:32
uint16_t m_from
Row of the first entity we iterate from.
Definition chunk_iterator.h:40
GAIA_NODISCARD auto view_auto()
Returns either a mutable or immutable entity/component view based on the requested type....
Definition chunk_iterator.h:230
GAIA_NODISCARD bool has() const
Checks if component T is present in the chunk.
Definition chunk_iterator.h:270
GroupId m_groupId
GroupId. 0 if not set.
Definition chunk_iterator.h:44
GAIA_NODISCARD bool has(Pair pair) const
Checks if relationship pair pair is present in the chunk.
Definition chunk_iterator.h:262
GAIA_NODISCARD bool has(Entity entity) const
Checks if entity entity is present in the chunk.
Definition chunk_iterator.h:255
GAIA_NODISCARD uint16_t from() const noexcept
Returns the starting index of the iterator.
Definition chunk_iterator.h:317
GAIA_NODISCARD auto view_mut()
Returns a mutable entity or component view.
Definition chunk_iterator.h:168
uint16_t m_to
Row of the last entity we iterate to.
Definition chunk_iterator.h:42
Wrapper for two Entities forming a relationship pair.
Definition id.h:395
Wrapper for two types forming a relationship pair. Depending on what types are used to form a pair it...
Definition id.h:202
Checks if endianess was detected correctly at compile-time.
Definition bitset.h:9
Definition bit_utils.h:11