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