mirror of
https://github.com/Ukendio/jecs.git
synced 2025-09-23 08:39:16 +00:00
Compare commits
3 commits
5bf0d80ca4
...
8568277123
Author | SHA1 | Date | |
---|---|---|---|
|
8568277123 | ||
|
0874e426af | ||
|
f912866fcb |
2 changed files with 47 additions and 6 deletions
22
jecs.luau
22
jecs.luau
|
@ -126,6 +126,8 @@ type world = {
|
|||
|
||||
max_component_id: number,
|
||||
max_archetype_id: number,
|
||||
start_component_id: number,
|
||||
start_tag_id: number,
|
||||
|
||||
observable: Map<i53, Map<i53, { Observer }>>,
|
||||
|
||||
|
@ -163,6 +165,8 @@ export type World = {
|
|||
|
||||
max_component_id: number,
|
||||
max_archetype_id: number,
|
||||
start_component_id: number,
|
||||
start_tag_id: number,
|
||||
|
||||
observable: Map<Id, Map<Id, { Observer }>>,
|
||||
|
||||
|
@ -760,6 +764,12 @@ local function ECS_ID_IS_WILDCARD(e: i53): boolean
|
|||
return first == EcsWildcard or second == EcsWildcard
|
||||
end
|
||||
|
||||
local function get_max_ids_difference(world: World): (number, number)
|
||||
local diff_components = world.start_component_id - ecs_max_component_id
|
||||
local diff_tags = world.start_tag_id - ecs_max_tag_id
|
||||
return diff_components, diff_tags
|
||||
end
|
||||
|
||||
local function id_record_get(world: World, id: Entity): ComponentRecord?
|
||||
local component_index = world.component_index
|
||||
local idr: ComponentRecord = component_index[id]
|
||||
|
@ -2110,15 +2120,13 @@ local function ecs_bulk_insert(world: world, entity: i53, ids: { i53 }, values:
|
|||
local dst_types = ids
|
||||
local to = archetype_ensure(world, dst_types)
|
||||
new_entity(entity, r, to)
|
||||
local row = r.row
|
||||
local columns_map = to.columns_map
|
||||
for i, id in ids do
|
||||
local value = values[i]
|
||||
local cdr = component_index[id]
|
||||
|
||||
local on_add = cdr.on_add
|
||||
if value then
|
||||
columns_map[id][row] = value
|
||||
r.archetype.columns_map[id][r.row] = value
|
||||
if on_add then
|
||||
on_add(entity, id, value :: any)
|
||||
end
|
||||
|
@ -2148,12 +2156,10 @@ local function ecs_bulk_insert(world: world, entity: i53, ids: { i53 }, values:
|
|||
end
|
||||
|
||||
local to = archetype_ensure(world, dst_types)
|
||||
local columns_map = to.columns_map
|
||||
|
||||
if from ~= to then
|
||||
entity_move(entity_index, entity, r, to)
|
||||
end
|
||||
local row = r.row
|
||||
|
||||
for i, set in emplaced do
|
||||
local id = ids[i]
|
||||
|
@ -2164,7 +2170,7 @@ local function ecs_bulk_insert(world: world, entity: i53, ids: { i53 }, values:
|
|||
local on_add = idr.on_add
|
||||
|
||||
if value ~= nil then
|
||||
columns_map[id][row] = value
|
||||
r.archetype.columns_map[id][r.row] = value
|
||||
local on_change = idr.on_change
|
||||
local hook = if set then on_change else on_add
|
||||
if hook then
|
||||
|
@ -2264,6 +2270,9 @@ local function world_new()
|
|||
max_archetype_id = 0,
|
||||
max_component_id = ecs_max_component_id,
|
||||
|
||||
start_component_id = ecs_max_component_id,
|
||||
start_tag_id = ecs_max_tag_id,
|
||||
|
||||
observable = observable,
|
||||
signals = signals,
|
||||
} :: world
|
||||
|
@ -3365,6 +3374,7 @@ return {
|
|||
pair_first = ecs_pair_first :: <P, O>(world: World, pair: Pair<P, O>) -> Id<P>,
|
||||
pair_second = ecs_pair_second :: <P, O>(world: World, pair: Pair<P, O>) -> Id<O>,
|
||||
entity_index_get_alive = entity_index_get_alive,
|
||||
get_max_ids_difference = get_max_ids_difference,
|
||||
|
||||
archetype_append_to_records = archetype_append_to_records,
|
||||
id_record_ensure = id_record_ensure :: (World, Id) -> ComponentRecord,
|
||||
|
|
|
@ -331,6 +331,37 @@ TEST("bulk", function()
|
|||
CHECK(world:has(e, c1, c2, c3))
|
||||
CHECK(count == 3)
|
||||
end
|
||||
|
||||
do CASE "Should bulk add with hooks moving archetypes without previous"
|
||||
local world = jecs.world()
|
||||
local c1, c2, c3 = world:component(), world:component(), world:component()
|
||||
|
||||
world:added(c1, function(e)
|
||||
world:set(e, c3, "hello")
|
||||
end)
|
||||
|
||||
local e = world:entity()
|
||||
jecs.bulk_insert(world, e, {c1,c2}, {true, 123})
|
||||
CHECK(world:get(e, c1) == true)
|
||||
CHECK(world:get(e, c2) == 123)
|
||||
CHECK(world:get(e, c3) == "hello")
|
||||
end
|
||||
|
||||
do CASE "Should bulk add with hooks moving archetypes with previous"
|
||||
local world = jecs.world()
|
||||
local c1, c2, c3 = world:component(), world:component(), world:component()
|
||||
|
||||
world:added(c1, function(e)
|
||||
world:set(e, c3, "hello")
|
||||
end)
|
||||
|
||||
local e = world:entity()
|
||||
world:add(e, world:entity())
|
||||
jecs.bulk_insert(world, e, {c1,c2}, {true, 123})
|
||||
CHECK(world:get(e, c1) == true)
|
||||
CHECK(world:get(e, c2) == 123)
|
||||
CHECK(world:get(e, c3) == "hello")
|
||||
end
|
||||
end)
|
||||
|
||||
TEST("repro", function()
|
||||
|
|
Loading…
Reference in a new issue