Adding already added entities no longer removes them from the World first, just updates them to relavent Systems.

This commit is contained in:
bakpakin 2015-08-27 14:31:45 -04:00
parent dba8e7c89f
commit 18270cd60a

View File

@ -356,6 +356,9 @@ function tiny.world(...)
-- List of Entities to remove -- List of Entities to remove
entitiesToRemove = {}, entitiesToRemove = {},
-- List of Entities to change
entitiesToChange = {},
-- List of Entities to add -- List of Entities to add
systemsToAdd = {}, systemsToAdd = {},
@ -383,10 +386,12 @@ end
-- Also call this on Entities that have changed Components such that they -- Also call this on Entities that have changed Components such that they
-- match different Filters. Returns the Entity. -- match different Filters. Returns the Entity.
function tiny.addEntity(world, entity) function tiny.addEntity(world, entity)
local e2a = world.entitiesToAdd
e2a[#e2a + 1] = entity
if world.entities[entity] then if world.entities[entity] then
tiny_removeEntity(world, entity) local e2c = world.entitiesToChange
e2c[#e2c + 1] = entity
else
local e2a = world.entitiesToAdd
e2a[#e2a + 1] = entity
end end
return entity return entity
end end
@ -532,16 +537,19 @@ function tiny_manageSystems(world)
end end
end end
-- Adds and removes Entities that have been marked. -- Adds, removes, and changes Entities that have been marked.
function tiny_manageEntities(world) function tiny_manageEntities(world)
local e2a, e2r = world.entitiesToAdd, world.entitiesToRemove local e2a = world.entitiesToAdd
local e2r = world.entitiesToRemove
local e2c = world.entitiesToChange
-- Early exit -- Early exit
if #e2a == 0 and #e2r == 0 then if #e2a == 0 and #e2r == 0 and #e2c == 0 then
return return
end end
world.entitiesToChange = {}
world.entitiesToAdd = {} world.entitiesToAdd = {}
world.entitiesToRemove = {} world.entitiesToRemove = {}
@ -551,6 +559,44 @@ function tiny_manageEntities(world)
local entity, system, index local entity, system, index
local onRemove, onAdd, ses, seis, filter, tmpEntity local onRemove, onAdd, ses, seis, filter, tmpEntity
-- Change Entities
for i = 1, #e2c do
entity = e2c[i]
if entities[entity] then
for j = 1, #systems do
system = systems[j]
ses = system.entities
seis = system.indices
index = seis[entity]
filter = system.filter
if filter and filter(system, entity) then
if not index then
system.modified = true
index = #ses + 1
ses[index] = entity
seis[entity] = index
onAdd = system.onAdd
if onAdd then
onAdd(system, entity)
end
end
elseif index then
system.modified = true
tmpEntity = ses[#ses]
ses[index] = tmpEntity
seis[tmpEntity] = index
seis[entity] = nil
ses[#ses] = nil
onRemove = system.onRemove
if onRemove then
onRemove(system, entity)
end
end
end
end
e2c[i] = nil
end
-- Remove Entities -- Remove Entities
for i = 1, #e2r do for i = 1, #e2r do
entity = e2r[i] entity = e2r[i]