using System; using System.Reflection; using System.Collections.Generic; namespace Encompass { internal class RenderManager { private readonly ComponentManager componentManager; private readonly DrawLayerManager drawLayerManager; private readonly EntityManager entityManager; private readonly Dictionary> drawComponentTypeToOrderedRenderer = new Dictionary>(); public RenderManager( ComponentManager componentManager, DrawLayerManager drawLayerManager, EntityManager entityManager ) { this.componentManager = componentManager; this.drawLayerManager = drawLayerManager; this.entityManager = entityManager; } public void RegisterOrderedRenderer(Action renderAction) where TComponent : struct, IComponent { drawComponentTypeToOrderedRenderer.Add(typeof(TComponent), renderAction); } public void RegisterGeneralRendererWithLayer(GeneralRenderer renderer, int layer) { drawLayerManager.RegisterGeneralRendererWithLayer(renderer, layer); } public void Draw() { foreach (var layer in drawLayerManager.LayerOrder) { var componentIDSet = drawLayerManager.ComponentIDsByLayer(layer); var generalRendererSet = drawLayerManager.GeneralRenderersByLayer(layer); foreach (var componentID in componentIDSet) { var componentType = componentManager.GetComponentTypeByID(componentID); var component = componentManager.GetComponentByID(componentType, componentID); var entityID = componentManager.GetEntityIDByComponentID(componentID); var entity = entityManager.GetEntity(entityID); if (drawComponentTypeToOrderedRenderer.ContainsKey(componentType)) { var internalRenderAction = drawComponentTypeToOrderedRenderer[componentType]; internalRenderAction(entity, component); } } foreach (var generalRenderer in generalRendererSet) { generalRenderer.Render(); } } } } }