From 88bdd4c8e5760fc2c7668e6d9593fe4df612a3f4 Mon Sep 17 00:00:00 2001 From: tortar Date: Fri, 21 Nov 2025 13:54:45 +0100 Subject: [PATCH 1/4] Add methods to collect entities of a query --- src/Ark.jl | 2 +- src/query.jl | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/Ark.jl b/src/Ark.jl index 8c3d8a759..6db57d548 100644 --- a/src/Ark.jl +++ b/src/Ark.jl @@ -27,7 +27,7 @@ include("batch.jl") #include("docs.jl") # doctest setup export World -export is_alive, new_entity!, new_entities!, copy_entity! +export is_alive, new_entity!, new_entities!, collect_entities, collect_entities!, copy_entity! export remove_entity!, zero_entity, is_locked, reset! export get_components, set_components!, has_components export add_components!, remove_components! diff --git a/src/query.jl b/src/query.jl index 2e446cc2c..bd65cae02 100644 --- a/src/query.jl +++ b/src/query.jl @@ -242,6 +242,39 @@ function count_entities(q::Query) count end +function collect_entities(q::Query) + all_entities = Vector{Entity}(undef, count_entities(q)) + for archetype in q._archetypes + if isempty(archetype.entities) + continue + end + if _contains_all(archetype.mask, q._mask) && + !(q._has_excluded && _contains_any(archetype.mask, q._exclude_mask)) + e = archetype.entities + unsafe_copyto!(all_entities, length(all_entities)+1, e, 1, length(e)) + end + end + return all_entities +end + +function collect_entities!(q::Query, all_entities::AbstractVector{Entity}) + count = count_entities(q) + if length(all_entities) != count + error(lazy"Container size mismatch: expected $count, got $(length(all_entities))") + end + for archetype in q._archetypes + if isempty(archetype.entities) + continue + end + if _contains_all(archetype.mask, q._mask) && + !(q._has_excluded && _contains_any(archetype.mask, q._exclude_mask)) + e = archetype.entities + unsafe_copyto!(all_entities, length(all_entities)+1, e, 1, length(e)) + end + end + return all_entities +end + """ close!(q::Query) From 8cdbf1c26adf3378b82f5a839489c97ca7ef4f6c Mon Sep 17 00:00:00 2001 From: Adriano Meligrana <68152031+Tortar@users.noreply.github.com> Date: Fri, 21 Nov 2025 14:03:14 +0100 Subject: [PATCH 2/4] Resize all_entities to match entity count --- src/query.jl | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/query.jl b/src/query.jl index bd65cae02..e839839ca 100644 --- a/src/query.jl +++ b/src/query.jl @@ -259,9 +259,7 @@ end function collect_entities!(q::Query, all_entities::AbstractVector{Entity}) count = count_entities(q) - if length(all_entities) != count - error(lazy"Container size mismatch: expected $count, got $(length(all_entities))") - end + resize!(all_entities, count) for archetype in q._archetypes if isempty(archetype.entities) continue From b98fa5171b19a3788d99d59516ddf014e08627e4 Mon Sep 17 00:00:00 2001 From: Adriano Meligrana <68152031+Tortar@users.noreply.github.com> Date: Fri, 21 Nov 2025 14:05:49 +0100 Subject: [PATCH 3/4] Update query.jl --- src/query.jl | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/query.jl b/src/query.jl index e839839ca..0c7781cd8 100644 --- a/src/query.jl +++ b/src/query.jl @@ -244,6 +244,7 @@ end function collect_entities(q::Query) all_entities = Vector{Entity}(undef, count_entities(q)) + offset = 1 for archetype in q._archetypes if isempty(archetype.entities) continue @@ -251,7 +252,8 @@ function collect_entities(q::Query) if _contains_all(archetype.mask, q._mask) && !(q._has_excluded && _contains_any(archetype.mask, q._exclude_mask)) e = archetype.entities - unsafe_copyto!(all_entities, length(all_entities)+1, e, 1, length(e)) + unsafe_copyto!(all_entities, offset, e, 1, length(e)) + offset += length(e) end end return all_entities @@ -260,6 +262,7 @@ end function collect_entities!(q::Query, all_entities::AbstractVector{Entity}) count = count_entities(q) resize!(all_entities, count) + offset = 1 for archetype in q._archetypes if isempty(archetype.entities) continue @@ -267,7 +270,8 @@ function collect_entities!(q::Query, all_entities::AbstractVector{Entity}) if _contains_all(archetype.mask, q._mask) && !(q._has_excluded && _contains_any(archetype.mask, q._exclude_mask)) e = archetype.entities - unsafe_copyto!(all_entities, length(all_entities)+1, e, 1, length(e)) + unsafe_copyto!(all_entities, offset, e, 1, length(e)) + offset += length(e) end end return all_entities From a759e2e8ea49aed0705f0d2f2b9d648a33813321 Mon Sep 17 00:00:00 2001 From: Adriano Meligrana <68152031+Tortar@users.noreply.github.com> Date: Fri, 21 Nov 2025 14:07:28 +0100 Subject: [PATCH 4/4] Remove collect_entities function Removed the collect_entities function that was previously used to gather entities from a query. --- src/query.jl | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/query.jl b/src/query.jl index 0c7781cd8..57ff7f803 100644 --- a/src/query.jl +++ b/src/query.jl @@ -242,23 +242,6 @@ function count_entities(q::Query) count end -function collect_entities(q::Query) - all_entities = Vector{Entity}(undef, count_entities(q)) - offset = 1 - for archetype in q._archetypes - if isempty(archetype.entities) - continue - end - if _contains_all(archetype.mask, q._mask) && - !(q._has_excluded && _contains_any(archetype.mask, q._exclude_mask)) - e = archetype.entities - unsafe_copyto!(all_entities, offset, e, 1, length(e)) - offset += length(e) - end - end - return all_entities -end - function collect_entities!(q::Query, all_entities::AbstractVector{Entity}) count = count_entities(q) resize!(all_entities, count)