From c50c61b30c2616bb4ebc0a0a2fbf5eca9b9d6fca Mon Sep 17 00:00:00 2001 From: Ukendio Date: Tue, 10 Jun 2025 16:00:41 +0200 Subject: [PATCH] Handle removal of (*, R) pairs --- jecs.luau | 2 +- test/tests.luau | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/jecs.luau b/jecs.luau index 0033e34..416bc1f 100644 --- a/jecs.luau +++ b/jecs.luau @@ -1413,11 +1413,11 @@ local function world_delete(world: ecs_world_t, entity: i53) for i = tr, tr + tr_count - 1 do ids[types[i]] = true end + local n = #entities table.move(entities, 1, n, count + 1, children) count += n end - for _, child in children do for id in ids do world_remove(world, child, id) diff --git a/test/tests.luau b/test/tests.luau index d5e578f..eefe422 100644 --- a/test/tests.luau +++ b/test/tests.luau @@ -289,6 +289,27 @@ TEST("world:contains()", function() end) TEST("world:delete()", function() + do CASE "remove (*, R) pairs when relationship is invalidated" + print("-------") + local world = jecs.world() + local e1 = world:entity() + local e2 = world:entity() + + local A = world:component() + local B = world:component() + local C = world:component() + + world:add(e1, pair(e2, A)) + world:add(e1, B) -- Some stable component that should not be removed in the process + world:add(e1, pair(e2, C)) + world:delete(e2) + + CHECK(not world:contains(e2)) + CHECK(not world:has(e1, pair(e2, A))) + CHECK(world:has(e1, B)) + CHECK(not world:has(e1, pair(e2, C))) + CHECK(world:contains(e1)) + end do CASE "remove pair when relationship is deleted" local world = jecs.world() local e1 = world:entity()