Compare commits

..

1 commit

Author SHA1 Message Date
Clown
73c316361e
Merge 96bed9bd7e into d0af80577b 2025-04-26 16:18:33 -05:00
2 changed files with 64 additions and 43 deletions

View file

@ -772,26 +772,38 @@ local function world_entity(world: ecs_world_t, entity: i53?): i53
local r = sparse_array[index] local r = sparse_array[index]
if r then if r then
local dense = r.dense local dense = r.dense
if not dense or dense == 0 then
if not dense or r.dense == 0 then
r.dense = index
dense = index dense = index
end end
local any = dense_array[dense] local any = dense_array[dense]
if dense <= alive_count then if any == entity then
return any if alive_count > dense then
r.dense = dense
return entity
end end
local e_swap = dense_array[alive_count]
local e_swap = dense_array[dense] local r_swap = sparse_array[alive_count]
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_swap.dense = dense
r.dense = alive_count r.dense = alive_count
dense_array[alive_count] = entity
dense_array[dense] = e_swap dense_array[dense] = e_swap
dense_array[alive_count] = any return entity
end
-- assert(any ~= 0) should never happen
local e_swap = dense_array[alive_count]
local r_swap = sparse_array[alive_count]
if dense <= alive_count then
alive_count += 1
entity_index.alive_count = alive_count
end
r_swap.dense = dense
r.dense = alive_count
dense_array[alive_count] = any
dense_array[dense] = e_swap
return any return any
else else
for i = max_id + 1, index do for i = max_id + 1, index do

View file

@ -634,39 +634,25 @@ TEST("world:each()", function()
end) end)
TEST("world:range()", function() TEST("world:range()", function()
do CASE "under range start" do CASE ""
local world = jecs.world() local world = jecs.world()
world:range(400, 1000) world = lifetime_tracker_add(world, {})
local id = world:entity() world:range(1000, 2000)
local e = world:entity(id + 5) local e = world:entity()
CHECK(e == id + 5) CHECK(e == 1000)
CHECK(world:contains(e))
local e2 = world:entity(399)
CHECK(world:contains(e2))
world:delete(e2)
CHECK(not world:contains(e2))
local e2v1 = world:entity(399)
CHECK(world:contains(e2v1))
CHECK(ECS_ID(e2v1) == 399)
CHECK(ECS_GENERATION(e2v1) == 1)
end
do CASE "over range start" world:entity(1590)
local world = jecs.world()
world:range(400, 1000)
local e2 = world:entity(405)
CHECK(world:contains(e2))
world:delete(e2)
CHECK(not world:contains(e2))
local e2v1 = world:entity(405)
CHECK(world:contains(e2v1))
CHECK(ECS_ID(e2v1) == 405)
CHECK(ECS_GENERATION(e2v1) == 1)
do CHECK(world:entity(5000) == 5000)
local _e2v1 = world:entity(405)
CHECK(_e2v1 == e2v1) CHECK(world:contains(1590))
end world:set(591, jecs.Name, "9888")
CHECK(not world:contains(591))
CHECK(world:contains(5000))
CHECK(not world:contains(988))
local e = world:entity(2000)
CHECK(e == 2000)
end end
end) end)
@ -677,8 +663,31 @@ TEST("world:entity()", function()
local e = world:entity(id + 5) local e = world:entity(id + 5)
CHECK(e == id + 5) CHECK(e == id + 5)
CHECK(world:contains(e)) CHECK(world:contains(e))
local e2 = world:entity(399) local e2 = world:entity()
CHECK(world:contains(e2)) CHECK(world:contains(e2))
-- world:print_entity_index()
local e3 = world:entity(275)
CHECK(e3 == 275)
CHECK(world:contains(e3))
CHECK(e3 == world:entity(e3))
world:delete(e3)
local e3v1 = world:entity(275)
CHECK(not world:contains(275))
CHECK(jecs.ECS_GENERATION(e3v1) == 1)
CHECK(jecs.ECS_ID(e3v1) == 275)
CHECK(world:contains(e3v1))
-- world:print_entity_index()
world:entity(e3)
world:entity(e3)
world:entity(275)
end end
local N = 2^8 local N = 2^8