/// <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; } } }
private void ReleaseCriticalSectionOps() { while (criticalSectionEntityOps.Count > 0) { NextEntityBlock.DispatchOp(criticalSectionEntityOps.Dequeue()); } }
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); }
/// <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); } }
/// <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); }
/// <inheritdoc /> public virtual void CriticalSection(CriticalSectionPipelineOp criticalSectionOp) { NextEntityBlock.CriticalSection(criticalSectionOp); }
/// <inheritdoc /> public virtual void AddComponent(AddComponentPipelineOp addComponentOp) { NextEntityBlock.AddComponent(addComponentOp); }
/// <inheritdoc /> public virtual void ChangeAuthority(ChangeAuthorityPipelineOp changeAuthorityOp) { NextEntityBlock.ChangeAuthority(changeAuthorityOp); }
/// <inheritdoc /> public virtual void UpdateComponent(UpdateComponentPipelineOp updateComponentOp) { NextEntityBlock.UpdateComponent(updateComponentOp); }
/// <inheritdoc /> public virtual void RemoveEntity(RemoveEntityPipelineOp removeEntityOp) { NextEntityBlock.RemoveEntity(removeEntityOp); }
/// <inheritdoc /> public virtual void RemoveComponent(RemoveComponentPipelineOp removeComponentOp) { NextEntityBlock.RemoveComponent(removeComponentOp); }
/// <inheritdoc /> public virtual void AddEntity(AddEntityPipelineOp addEntity) { NextEntityBlock.AddEntity(addEntity); }
/// <inheritdoc /> public override void ChangeAuthority(ChangeAuthorityPipelineOp changeAuthorityOp) { NextEntityBlock.ChangeAuthority(changeAuthorityOp); }