encompass-cs/encompass-cs/DrawLayerManager.cs

127 lines
4.7 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.Linq;
2019-12-16 07:28:02 +00:00
using Encompass.Exceptions;
namespace Encompass
{
internal class DrawLayerManager
{
2019-06-20 17:46:15 +00:00
private readonly SortedList<int, int> layerOrder = new SortedList<int, int>();
private readonly Dictionary<int, ComponentStore> layerIndexToComponentStore = new Dictionary<int, ComponentStore>(512);
private readonly Dictionary<int, HashSet<GeneralRenderer>> layerIndexToGeneralRenderers = new Dictionary<int, HashSet<GeneralRenderer>>(512);
2019-06-20 17:46:15 +00:00
private readonly Dictionary<Type, Dictionary<Entity, int>> typeToEntityToLayer = new Dictionary<Type, Dictionary<Entity, int>>(512);
2019-12-22 09:15:58 +00:00
private Dictionary<Type, int> typeToIndex;
public IEnumerable<int> LayerOrder { get { return layerOrder.Values; } }
2019-12-22 09:15:58 +00:00
public DrawLayerManager(Dictionary<Type, int> typeToIndex)
2019-12-17 02:51:45 +00:00
{
2019-12-22 09:15:58 +00:00
this.typeToIndex = typeToIndex;
2019-12-17 02:51:45 +00:00
RegisterDrawLayer(0);
}
2019-12-16 07:28:02 +00:00
public void RegisterDrawLayer(int layer)
{
2019-12-16 07:28:02 +00:00
if (!layerIndexToComponentStore.ContainsKey(layer))
{
2019-12-16 07:28:02 +00:00
layerOrder.Add(layer, layer);
layerIndexToGeneralRenderers.Add(layer, new HashSet<GeneralRenderer>());
2019-12-22 09:15:58 +00:00
layerIndexToComponentStore.Add(layer, new ComponentStore(typeToIndex));
}
}
public void FinishRegistering()
{
foreach (var store in layerIndexToComponentStore.Values)
{
store.FinishRegistering();
}
2019-12-16 07:28:02 +00:00
}
2019-12-16 07:28:02 +00:00
public void RegisterOrderedDrawable<TComponent>() where TComponent : struct, IComponent
{
2019-12-17 02:51:45 +00:00
if (!typeToEntityToLayer.ContainsKey(typeof(TComponent)))
{
typeToEntityToLayer.Add(typeof(TComponent), new Dictionary<Entity, int>(128));
}
2019-12-16 07:28:02 +00:00
foreach (var pair in layerIndexToComponentStore)
{
2019-12-16 07:28:02 +00:00
pair.Value.RegisterComponentType<TComponent>();
}
}
2019-12-16 07:28:02 +00:00
public void RegisterGeneralRendererWithLayer(GeneralRenderer renderer, int layer)
{
RegisterDrawLayer(layer);
var set = layerIndexToGeneralRenderers[layer];
set.Add(renderer);
}
public void UnregisterGeneralRendererWithLayer(GeneralRenderer renderer, int layer)
{
if (layerIndexToGeneralRenderers.ContainsKey(layer))
{
layerIndexToGeneralRenderers[layer].Remove(renderer);
}
}
public void AdjustRendererLayer(GeneralRenderer renderer, int oldLayer, int newLayer)
{
UnregisterGeneralRendererWithLayer(renderer, oldLayer);
RegisterGeneralRendererWithLayer(renderer, newLayer);
}
2019-12-05 22:59:55 +00:00
public void RegisterComponentWithLayer<TComponent>(Entity entity, TComponent component, int layer) where TComponent : struct, IComponent
{
2019-12-16 07:28:02 +00:00
if (!layerIndexToComponentStore.ContainsKey(layer))
{
2019-12-16 07:28:02 +00:00
throw new UndefinedLayerException("Layer {0} is not defined. Use WorldBuilder.RegisterDrawLayer to register the layer.", layer);
}
if (typeToEntityToLayer[typeof(TComponent)].ContainsKey(entity)) { UnRegisterComponentWithLayer<TComponent>(entity); }
2019-11-23 00:43:07 +00:00
2019-12-16 07:28:02 +00:00
var set = layerIndexToComponentStore[layer];
set.Set<TComponent>(entity, component);
2019-12-05 22:59:55 +00:00
typeToEntityToLayer[typeof(TComponent)].Add(entity, layer);
}
public void UnRegisterComponentWithLayer<TComponent>(Entity entity) where TComponent : struct, IComponent
{
if (!typeToEntityToLayer.ContainsKey(typeof(TComponent))) { return; }
2019-12-05 22:59:55 +00:00
if (typeToEntityToLayer[typeof(TComponent)].ContainsKey(entity))
{
2019-12-05 22:59:55 +00:00
var layer = typeToEntityToLayer[typeof(TComponent)][entity];
layerIndexToComponentStore[layer].ForceRemove<TComponent>(entity);
}
2019-12-05 22:59:55 +00:00
typeToEntityToLayer[typeof(TComponent)].Remove(entity);
}
2019-12-05 22:59:55 +00:00
public void UnRegisterEntityWithLayer(Entity entity)
{
foreach (var store in layerIndexToComponentStore.Values)
{
store.Remove(entity);
}
}
public IEnumerable<GeneralRenderer> GeneralRenderersByLayer(int layer)
{
return layerIndexToGeneralRenderers.ContainsKey(layer) ?
layerIndexToGeneralRenderers[layer] :
Enumerable.Empty<GeneralRenderer>();
}
2019-12-05 22:59:55 +00:00
public IEnumerable<(Entity, Type, IComponent)> AllInLayer(int layer)
{
return layerIndexToComponentStore.ContainsKey(layer) ?
layerIndexToComponentStore[layer].AllInterfaceTyped() :
Enumerable.Empty<(Entity, Type, IComponent)>();
2019-12-05 22:59:55 +00:00
}
}
}