/// <inheritdoc />
        public void ProcessOps()
        {
            spawnLimiter.Reset();

            while (entitiesToAdd.Count > 0)
            {
                var entityId = entitiesToAdd.Dequeue();
                var actions  = entityActions[entityId];
                while (actions.Count > 0)
                {
                    var op = actions.Dequeue();
                    try // Ensure that exceptions in user code (e.g. OnEnable) don't disrupt processing of the entire queue.
                    {
                        NextEntityBlock.DispatchOp(op);
                    }
                    catch (Exception ex)
                    {
                        OnError(entityId, ex);
                    }
                }

                entityActions.Remove(entityId);
                workerMetrics.DecrementGauge(QueueSizeMetricName);
                spawnLimiter.EntityAdded(entityId);

                if (!spawnLimiter.CanSpawnEntity())
                {
                    break;
                }
            }
        }
        /// <inheritdoc />
        public void RemoveComponent(RemoveComponentPipelineOp removeComponentOp)
        {
            if (!IsEntityTracked(removeComponentOp.EntityId))
            {
                Debug.LogErrorFormat("Entity not found: OnComponentAdded({0}, {1})", removeComponentOp.EntityId,
                                     removeComponentOp.ComponentMetaClass);
                return;
            }

            if (universe.ContainsEntity(removeComponentOp.EntityId))
            {
                NextEntityBlock.RemoveComponent(removeComponentOp);
                return;
            }

            if (entitiesToSpawn.ContainsKey(removeComponentOp.EntityId))
            {
                var data = entitiesToSpawn[removeComponentOp.EntityId];
                data.StalledOps.Enqueue(removeComponentOp);

                if (removeComponentOp.ComponentMetaClass.ComponentId == Position.ComponentId)
                {
                    entitiesToSpawn[removeComponentOp.EntityId].Position = null;
                }
            }
        }
Esempio n. 3
0
 private void ReleaseCriticalSectionOps()
 {
     while (criticalSectionEntityOps.Count > 0)
     {
         NextEntityBlock.DispatchOp(criticalSectionEntityOps.Dequeue());
     }
 }
Esempio n. 4
0
        private void StallForCriticalSection(IEntityPipelineOp entityPipelineOp)
        {
            if (!inCriticalSection)
            {
                NextEntityBlock.DispatchOp(entityPipelineOp);
                return;
            }

            criticalSectionEntityOps.Enqueue(entityPipelineOp);
        }
        // Releases the entity from this stage of the pipeline
        private void ReleaseEntity(EntityId entityId)
        {
            var entitySpawnData = entitiesToSpawn[entityId];

            while (entitySpawnData.StalledOps.Count > 0)
            {
                NextEntityBlock.DispatchOp(entitySpawnData.StalledOps.Dequeue());
            }

            entitiesToSpawn.Remove(entityId);
        }
        /// <inheritdoc />
        public void UpdateComponent(UpdateComponentPipelineOp updateComponentOp)
        {
            var entityId = updateComponentOp.EntityId;

            if (IsEntityQueued(entityId))
            {
                entityActions[entityId].Enqueue(updateComponentOp);
            }
            else
            {
                NextEntityBlock.UpdateComponent(updateComponentOp);
            }
        }
        /// <inheritdoc />
        public void AddComponent(AddComponentPipelineOp addComponentOp)
        {
            var entityId = addComponentOp.EntityId;

            if (IsEntityQueued(entityId))
            {
                entityActions[entityId].Enqueue(addComponentOp);
            }
            else
            {
                NextEntityBlock.AddComponent(addComponentOp);
            }
        }
        /// <inheritdoc />
        public void ChangeAuthority(ChangeAuthorityPipelineOp changeAuthorityOp)
        {
            var entityId = changeAuthorityOp.EntityId;

            if (IsEntityQueued(entityId))
            {
                entityActions[entityId].Enqueue(changeAuthorityOp);
            }
            else
            {
                NextEntityBlock.ChangeAuthority(changeAuthorityOp);
            }
        }
        /// <inheritdoc />
        public void RemoveEntity(RemoveEntityPipelineOp removeEntityOp)
        {
            var entityId = removeEntityOp.EntityId;

            if (IsEntityQueued(entityId))
            {
                entityActions[entityId].Enqueue(removeEntityOp);
            }
            else
            {
                NextEntityBlock.RemoveEntity(removeEntityOp);
            }
        }
        /// <inheritdoc />
        public override void UpdateComponent(UpdateComponentPipelineOp updateComponentOp)
        {
            var entityId = updateComponentOp.EntityId;

            if (!universe.ContainsEntity(entityId))
            {
                Debug.LogError("EntityComponentUpdater::UpdateComponent: Entity not present: " + entityId);
                return;
            }

            var entity = universe.Get(entityId);

            entity.OnComponentUpdatePipelineOp(updateComponentOp);
            NextEntityBlock.UpdateComponent(updateComponentOp);
        }
        /// <inheritdoc />
        public override void RemoveComponent(RemoveComponentPipelineOp removeComponentOp)
        {
            var entityId = removeComponentOp.EntityId;

            if (!universe.ContainsEntity(entityId))
            {
                Debug.LogError("EntityComponentUpdater::RemoveComponent: Entity not present: " + entityId);
                return;
            }

            var entity = universe.Get(entityId);

            entity.OnRemoveComponentPipelineOp(removeComponentOp);
            NextEntityBlock.RemoveComponent(removeComponentOp);
        }
        /// <inheritdoc />
        public override void ChangeAuthority(ChangeAuthorityPipelineOp changeAuthorityOp)
        {
            var entityId = changeAuthorityOp.EntityId;

            if (!universe.ContainsEntity(entityId))
            {
                Debug.LogError("EntityComponentUpdater::ChangeAuthority: Entity not present: " + entityId);
                return;
            }

            var entity = universe.Get(entityId);

            entity.OnAuthorityChangePipelineOp(changeAuthorityOp);
            NextEntityBlock.ChangeAuthority(changeAuthorityOp);
        }
        /// <inheritdoc />
        public override void AddComponent(AddComponentPipelineOp addComponentOp)
        {
            var entityId = addComponentOp.EntityId;

            if (!universe.ContainsEntity(entityId))
            {
                Debug.LogError("EntityComponentUpdater::AddComponent: Entity not present: " + entityId);
                return;
            }

            var entity = universe.Get(entityId);

            entity.OnAddComponentPipelineOp(addComponentOp);
            NextEntityBlock.AddComponent(addComponentOp);
        }
Esempio n. 14
0
        /// <inheritdoc />
        public override void RemoveComponent(RemoveComponentPipelineOp removeComponentOp)
        {
            NextEntityBlock.RemoveComponent(removeComponentOp);
            var entity = universe.Get(removeComponentOp.EntityId);

            if (entity != null)
            {
                if (entity.Visualizers is EntityVisualizers)
                {
                    ((EntityVisualizers)entity.Visualizers).OnComponentRemoved(removeComponentOp.ComponentMetaClass, removeComponentOp.ComponentObject);
                }
            }
            else
            {
                Debug.LogErrorFormat("Entity not found: OnComponentRemoved({0}, {1})", removeComponentOp.EntityId, removeComponentOp.ComponentMetaClass);
            }
        }
Esempio n. 15
0
        /// <inheritdoc />
        public override void AddComponent(AddComponentPipelineOp addComponentOp)
        {
            var entity = universe.Get(addComponentOp.EntityId);

            if (entity != null)
            {
                if (entity.Visualizers is EntityVisualizers)
                {
                    ((EntityVisualizers)entity.Visualizers).OnComponentAdded(addComponentOp.ComponentMetaClass, addComponentOp.ComponentObject);
                }
            }
            else
            {
                Debug.LogErrorFormat("Entity not found: OnComponentAdded({0}, {1})", addComponentOp.EntityId, addComponentOp.ComponentMetaClass);
            }

            NextEntityBlock.AddComponent(addComponentOp);
        }
        /// <inheritdoc />
        public void UpdateComponent(UpdateComponentPipelineOp updateComponentOp)
        {
            if (!IsEntityTracked(updateComponentOp.EntityId))
            {
                Debug.LogErrorFormat("Entity not found: OnComponentUpdate({0}, {1}).",
                                     updateComponentOp.EntityId, updateComponentOp.ComponentMetaClass);
                return;
            }

            if (universe.ContainsEntity(updateComponentOp.EntityId))
            {
                NextEntityBlock.UpdateComponent(updateComponentOp);
                return;
            }

            if (entitiesToSpawn.ContainsKey(updateComponentOp.EntityId))
            {
                entitiesToSpawn[updateComponentOp.EntityId].StalledOps.Enqueue(updateComponentOp);
            }
        }
        /// <inheritdoc />
        public void ChangeAuthority(ChangeAuthorityPipelineOp changeAuthorityOp)
        {
            if (!IsEntityTracked(changeAuthorityOp.EntityId))
            {
                Debug.LogErrorFormat("Entity not found: OnAuthorityChanged({0}, {1}) authority: {2}",
                                     changeAuthorityOp.EntityId, changeAuthorityOp.ComponentMetaClass, changeAuthorityOp.Authority);
                return;
            }

            if (universe.ContainsEntity(changeAuthorityOp.EntityId))
            {
                NextEntityBlock.ChangeAuthority(changeAuthorityOp);
                return;
            }

            if (entitiesToSpawn.ContainsKey(changeAuthorityOp.EntityId))
            {
                entitiesToSpawn[changeAuthorityOp.EntityId].StalledOps.Enqueue(changeAuthorityOp);
            }
        }
        /// <inheritdoc />
        public void AddEntity(AddEntityPipelineOp addEntityOp)
        {
            if (spawnLimiter.CanSpawnEntity() && !IsEntityQueued(addEntityOp.EntityId))
            {
                NextEntityBlock.AddEntity(addEntityOp);
                spawnLimiter.EntityAdded(addEntityOp.EntityId);
            }
            else
            {
                Queue <IEntityPipelineOp> queue;
                if (!entityActions.TryGetValue(addEntityOp.EntityId, out queue))
                {
                    queue = entityActions[addEntityOp.EntityId] = new Queue <IEntityPipelineOp>();
                    workerMetrics.IncrementGauge(QueueSizeMetricName);
                    entitiesToAdd.Enqueue(addEntityOp.EntityId);
                }

                queue.Enqueue(addEntityOp);
            }
        }
        /// <inheritdoc />
        public void AddComponent(AddComponentPipelineOp addComponentOp)
        {
            if (!IsEntityTracked(addComponentOp.EntityId))
            {
                Debug.LogErrorFormat("Entity not found: OnComponentAdded({0}, {1})", addComponentOp.EntityId,
                                     addComponentOp.ComponentMetaClass);
                return;
            }

            if (universe.ContainsEntity(addComponentOp.EntityId))
            {
                NextEntityBlock.AddComponent(addComponentOp);
                return;
            }

            if (entitiesToSpawn.ContainsKey(addComponentOp.EntityId))
            {
                var entityData = entitiesToSpawn[addComponentOp.EntityId];

                entityData.StalledOps.Enqueue(addComponentOp);

                if (addComponentOp.ComponentMetaClass.ComponentId == Position.ComponentId)
                {
                    entityData.Position = ((Position.Impl)addComponentOp.ComponentObject).Data;
                    if (entityData.EntityType != null)
                    {
                        MakeEntity(addComponentOp.EntityId, entityData.EntityType, OnMakeEntitySuccess);
                    }
                }
                else if (addComponentOp.ComponentMetaClass.ComponentId == Metadata.ComponentId)
                {
                    entityData.EntityType = ((Metadata.Impl)addComponentOp.ComponentObject).Data.entityType;
                    if (entityData.Position.HasValue)
                    {
                        MakeEntity(addComponentOp.EntityId, entityData.EntityType, OnMakeEntitySuccess);
                    }
                }
            }
        }
        /// <inheritdoc />
        public void RemoveEntity(RemoveEntityPipelineOp removeEntityOp)
        {
            if (!IsEntityTracked(removeEntityOp.EntityId))
            {
                Debug.LogErrorFormat("Trying to destroy an entity we don't have: {0}", removeEntityOp.EntityId);
                return;
            }

            metrics.DecrementGauge(EntityCountGaugeName);

            if (universe.ContainsEntity(removeEntityOp.EntityId))
            {
                NextEntityBlock.RemoveEntity(removeEntityOp);
                var entity = universe.Get(removeEntityOp.EntityId);
                DestroyEntity(entity);
            }

            if (entitiesToSpawn.ContainsKey(removeEntityOp.EntityId))
            {
                entitiesToSpawn.Remove(removeEntityOp.EntityId);
            }

            knownEntities.Remove(removeEntityOp.EntityId);
        }
Esempio n. 21
0
 /// <inheritdoc />
 public virtual void CriticalSection(CriticalSectionPipelineOp criticalSectionOp)
 {
     NextEntityBlock.CriticalSection(criticalSectionOp);
 }
Esempio n. 22
0
 /// <inheritdoc />
 public virtual void AddComponent(AddComponentPipelineOp addComponentOp)
 {
     NextEntityBlock.AddComponent(addComponentOp);
 }
Esempio n. 23
0
 /// <inheritdoc />
 public virtual void ChangeAuthority(ChangeAuthorityPipelineOp changeAuthorityOp)
 {
     NextEntityBlock.ChangeAuthority(changeAuthorityOp);
 }
Esempio n. 24
0
 /// <inheritdoc />
 public virtual void UpdateComponent(UpdateComponentPipelineOp updateComponentOp)
 {
     NextEntityBlock.UpdateComponent(updateComponentOp);
 }
Esempio n. 25
0
 /// <inheritdoc />
 public virtual void RemoveEntity(RemoveEntityPipelineOp removeEntityOp)
 {
     NextEntityBlock.RemoveEntity(removeEntityOp);
 }
Esempio n. 26
0
 /// <inheritdoc />
 public virtual void RemoveComponent(RemoveComponentPipelineOp removeComponentOp)
 {
     NextEntityBlock.RemoveComponent(removeComponentOp);
 }
Esempio n. 27
0
 /// <inheritdoc />
 public virtual void AddEntity(AddEntityPipelineOp addEntity)
 {
     NextEntityBlock.AddEntity(addEntity);
 }
Esempio n. 28
0
 /// <inheritdoc />
 public override void ChangeAuthority(ChangeAuthorityPipelineOp changeAuthorityOp)
 {
     NextEntityBlock.ChangeAuthority(changeAuthorityOp);
 }