From 75f2584bf40747565757be9bdc4baacd33cbac06 Mon Sep 17 00:00:00 2001 From: Ukendio Date: Thu, 27 Mar 2025 05:08:38 +0100 Subject: [PATCH] Clear ID will remove ID from all entities --- jecs.luau | 16 ++++++++++++++++ test/tests.luau | 27 +++++++++++++++++++++++++++ text.txt | 0 3 files changed, 43 insertions(+) create mode 100644 text.txt diff --git a/jecs.luau b/jecs.luau index 7f5de89..69a4ad7 100644 --- a/jecs.luau +++ b/jecs.luau @@ -1073,6 +1073,22 @@ local function world_clear(world: ecs_world_t, entity: i53) local archetype = record.archetype local row = record.row + local idr = world.component_index[entity] + if idr then + local count = 0 + local queue = {} + for archetype_id in idr.cache do + local idr_archetype = world.archetypes[archetype_id] + local entities = idr_archetype.entities + local n = #entities + count += n + table.move(entities, 1, n, #queue + 1, queue) + end + for _, e in queue do + world_remove(world, e, entity) + end + end + if archetype then -- In the future should have a destruct mode for -- deleting archetypes themselves. Maybe requires recycling diff --git a/test/tests.luau b/test/tests.luau index 0e686df..7e4d6fa 100644 --- a/test/tests.luau +++ b/test/tests.luau @@ -1093,6 +1093,33 @@ TEST("world:children", function() end) TEST("world:clear()", function() + do + CASE("should remove its components") + local world = jecs.World.new() :: World + local A = world:component() + local B = world:component() + local C = world:component() + local D = world:component() + + local e = world:entity() + local e1 = world:entity() + local e2 = world:entity() + + world:set(e, A, true) + world:set(e, B, true) + + world:set(e1, A, true) + world:set(e1, B, true) + + CHECK(world:get(e, A)) + CHECK(world:get(e, B)) + + world:clear(A) + CHECK(world:get(e, A) == nil) + CHECK(world:get(e, B)) + CHECK(world:get(e1, A) == nil) + CHECK(world:get(e1, B)) + end do CASE("should remove its components") local world = jecs.World.new() :: World diff --git a/text.txt b/text.txt new file mode 100644 index 0000000..e69de29