diff --git a/app/ecs/ecs.js b/app/ecs/ecs.js index 0af602c..35dacc6 100644 --- a/app/ecs/ecs.js +++ b/app/ecs/ecs.js @@ -88,22 +88,26 @@ export default class Ecs { if (componentsToRemove.length > 0) { removing.push([entityId, componentsToRemove]); } - if (this.$$entities[entityId]) { - const entity = this.$$entities[entityId]; + if (this.$$entities[entityIdString]) { + const entity = this.$$entities[entityIdString]; + let isInserting = false; const entityInserts = {}; + let isUpdating = false; const entityUpdates = {}; for (const componentName in componentsToUpdate) { if (entity[componentName]) { entityUpdates[componentName] = componentsToUpdate[componentName]; + isUpdating = true; } else { entityInserts[componentName] = componentsToUpdate[componentName]; + isInserting = true; } } - if (Object.keys(entityInserts).length > 0) { + if (isInserting) { inserting.push([entityId, entityInserts]); } - if (Object.keys(entityUpdates).length > 0) { + if (isUpdating) { updating.push([entityId, entityUpdates]); } } @@ -111,9 +115,6 @@ export default class Ecs { creating.push([entityId, componentsToUpdate]); } } - if (destroying.size > 0) { - this.destroyMany(destroying); - } const promises = []; if (inserting.length > 0) { promises.push(this.insertMany(inserting)); @@ -125,6 +126,9 @@ export default class Ecs { promises.push(this.createManySpecific(creating)); } await Promise.all(promises); + if (destroying.size > 0) { + this.destroyMany(destroying); + } if (removing.length > 0) { this.removeMany(removing); } diff --git a/app/react/components/pixi/entities.jsx b/app/react/components/pixi/entities.jsx index b0a16f7..3705ad9 100644 --- a/app/react/components/pixi/entities.jsx +++ b/app/react/components/pixi/entities.jsx @@ -29,33 +29,36 @@ export default function Entities({monopolizers, particleWorker}) { interactionFilters[0].brightness = (pulse * 0.75) + 1; interactionFilters[1].outerStrength = pulse * 0.5; const updateEntities = useCallback((payload) => { - if (0 === Object.keys(entities.current).length) { - for (let i = 0; i < 1000; ++i) { - pool.current.push(new Entity()); - } - } for (const id in payload) { + if ('1' === id) { + continue; + } if (!payload[id]) { entities.current[id].removeFromContainer(); pool.current.push(entities.current[id]); delete entities.current[id]; continue; } - const entity = ecs.get(id); - if (!entity.Position) { - continue; - } if (!entities.current[id]) { - entities.current[id] = pool.current.length > 0 ? pool.current.pop() : new Entity(); - entities.current[id].reset(entity, debug); - } - if (mainEntity === id) { - entities.current[id].setMainEntity(); + entities.current[id] = pool.current.length > 0 + ? pool.current.pop() + : new Entity(); + entities.current[id].reset(ecs.get(id), debug); + if (mainEntity === id) { + entities.current[id].setMainEntity(); + } } entities.current[id].update(payload[id]); entities.current[id].addToContainer(containerRef.current); } }, [debug, ecs, mainEntity]) + useEffect(() => { + if (0 === pool.current.length) { + for (let i = 0; i < 1000; ++i) { + pool.current.push(new Entity()); + } + } + }, []); useEffect(() => { for (const key in entities.current) { entities.current[key].setDebug(debug);