From 01821f0a7bd0ab0ecce02036a35a667e3ca1d2a0 Mon Sep 17 00:00:00 2001 From: Ukendio Date: Sun, 27 Apr 2025 05:03:49 +0200 Subject: [PATCH] Handle only make_alive behaviour in overload --- jecs.luau | 29 +++++++++++++---------------- test/tests.luau | 35 ----------------------------------- 2 files changed, 13 insertions(+), 51 deletions(-) diff --git a/jecs.luau b/jecs.luau index b22bd70..dc6ab65 100644 --- a/jecs.luau +++ b/jecs.luau @@ -773,26 +773,23 @@ local function world_entity(world: ecs_world_t, entity: i53?): i53 if r then local dense = r.dense if dense and r.dense ~= 0 then - local any = dense_array[dense] - if any ~= entity then - if dense > alive_count then - alive_count += 1 - entity_index.alive_count = alive_count - local e_swap = dense_array[alive_count] - local r_swap = sparse_array[alive_count] - r_swap.dense = dense - r.dense = alive_count - dense_array[alive_count] = any - dense_array[dense] = e_swap - end - return any + if dense < alive_count then + return entity end - return entity else r.dense = index - dense_array[index] = entity - return entity + dense = index end + + local e_swap = dense_array[dense] + local r_swap = entity_index_try_get_any(entity_index, e_swap) :: ecs_record_t + alive_count += 1 + entity_index.alive_count = alive_count + r_swap.dense = dense + r.dense = alive_count + dense_array[dense] = e_swap + dense_array[alive_count] = entity + return entity else for i = max_id + 1, index do sparse_array[i] = { dense = i } :: ecs_record_t diff --git a/test/tests.luau b/test/tests.luau index bbef91d..7043226 100644 --- a/test/tests.luau +++ b/test/tests.luau @@ -666,41 +666,6 @@ TEST("world:entity()", function() CHECK(world:contains(e)) local e2 = world:entity() CHECK(world:contains(e2)) - - -- world:print_entity_index() - print("-----") - local e3 = world:entity(375) - world:entity(376) - print("-----") - - print(e3) - CHECK(e3 == 375) - CHECK(world:contains(e3)) - - world:delete(e3) - - print("-------call 1-------") - local e3v1 = world:entity(375) - CHECK(not world:contains(375)) - CHECK(jecs.ECS_GENERATION(e3v1) == 1) - CHECK(jecs.ECS_ID(e3v1) == 375) - CHECK(world:contains(e3v1)) - print("-------call 2-------") - world:entity(382) - world:delete(382) - world:entity(376) - world:delete(e3v1) - print("--------------------") - print("-------call 3-------") - local e3v2 = world:entity(375) - CHECK(jecs.ECS_GENERATION(e3v2) == 2) - CHECK(jecs.ECS_ID(e3v2) == 375) - CHECK(not world:contains(e3v1)) - CHECK(world:contains(e3v2)) - print("----------------------") - print("-----call 4-------") - CHECK(world:entity(375) == e3v2) - print("------call 5") end local N = 2^8