fixed world initialization and draw component removal issues

pull/5/head
Evan Hemsley 2019-12-05 16:00:00 -08:00
parent 0293263684
commit 571310e579
4 changed files with 29 additions and 9 deletions

View File

@ -85,6 +85,7 @@ namespace Encompass
{ {
//componentStore.Remove<TComponent>(entity); //componentStore.Remove<TComponent>(entity);
componentMessageManager.Remove<TComponent>(entity); componentMessageManager.Remove<TComponent>(entity);
drawLayerManager.UnRegisterComponentWithLayer<TComponent>(entity);
} }
private void Remove(Entity entity) private void Remove(Entity entity)

View File

@ -11,7 +11,7 @@ namespace Encompass
private readonly ComponentStore existingComponentStore = new ComponentStore(); private readonly ComponentStore existingComponentStore = new ComponentStore();
private readonly ComponentStore pendingComponentStore = new ComponentStore(); private readonly ComponentStore pendingComponentStore = new ComponentStore();
private readonly ComponentStore upToDateComponentStore = new ComponentStore(); private ComponentStore upToDateComponentStore = new ComponentStore();
private readonly Dictionary<Type, Dictionary<Entity, int>> typeToEntityToPendingComponentPriority = new Dictionary<Type, Dictionary<Entity, int>>(); private readonly Dictionary<Type, Dictionary<Entity, int>> typeToEntityToPendingComponentPriority = new Dictionary<Type, Dictionary<Entity, int>>();
@ -30,6 +30,11 @@ namespace Encompass
} }
} }
internal void SetStartingComponentStore(ComponentStore componentStore)
{
upToDateComponentStore = componentStore;
}
internal void AddExistingComponentMessage<TComponent>(ComponentMessage<TComponent> componentMessage) where TComponent : struct, IComponent internal void AddExistingComponentMessage<TComponent>(ComponentMessage<TComponent> componentMessage) where TComponent : struct, IComponent
{ {
RegisterExistingOrPendingComponentMessage(componentMessage.entity, componentMessage.component); RegisterExistingOrPendingComponentMessage(componentMessage.entity, componentMessage.component);

View File

@ -7,7 +7,6 @@ namespace Encompass
internal class DrawLayerManager internal class DrawLayerManager
{ {
private readonly SortedList<int, int> layerOrder = new SortedList<int, int>(); private readonly SortedList<int, int> layerOrder = new SortedList<int, int>();
private readonly ComponentStore componentStore = new ComponentStore();
private readonly Dictionary<int, ComponentStore> layerIndexToComponentStore = new Dictionary<int, ComponentStore>(); private readonly Dictionary<int, ComponentStore> layerIndexToComponentStore = new Dictionary<int, ComponentStore>();
private readonly Dictionary<int, HashSet<GeneralRenderer>> layerIndexToGeneralRenderers = new Dictionary<int, HashSet<GeneralRenderer>>(); private readonly Dictionary<int, HashSet<GeneralRenderer>> layerIndexToGeneralRenderers = new Dictionary<int, HashSet<GeneralRenderer>>();
@ -52,7 +51,12 @@ namespace Encompass
public void RegisterComponentWithLayer<TComponent>(Entity entity, TComponent component, int layer) where TComponent : struct, IComponent public void RegisterComponentWithLayer<TComponent>(Entity entity, TComponent component, int layer) where TComponent : struct, IComponent
{ {
if (typeToEntityToLayer[typeof(TComponent)].ContainsKey(entity)) { UnRegisterComponentWithLayer(entity, component); } if (!typeToEntityToLayer.ContainsKey(typeof(TComponent)))
{
typeToEntityToLayer.Add(typeof(TComponent), new Dictionary<Entity, int>());
}
if (typeToEntityToLayer[typeof(TComponent)].ContainsKey(entity)) { UnRegisterComponentWithLayer<TComponent>(entity); }
if (layerIndexToComponentStore.ContainsKey(layer)) if (layerIndexToComponentStore.ContainsKey(layer))
{ {
@ -74,8 +78,10 @@ namespace Encompass
} }
} }
public void UnRegisterComponentWithLayer<TComponent>(Entity entity, TComponent component) where TComponent : struct, IComponent public void UnRegisterComponentWithLayer<TComponent>(Entity entity) where TComponent : struct, IComponent
{ {
if (!typeToEntityToLayer.ContainsKey(typeof(TComponent))) { return; }
if (typeToEntityToLayer[typeof(TComponent)].ContainsKey(entity)) if (typeToEntityToLayer[typeof(TComponent)].ContainsKey(entity))
{ {
var layer = typeToEntityToLayer[typeof(TComponent)][entity]; var layer = typeToEntityToLayer[typeof(TComponent)][entity];
@ -86,7 +92,10 @@ namespace Encompass
public void UnRegisterEntityWithLayer(Entity entity) public void UnRegisterEntityWithLayer(Entity entity)
{ {
componentStore.Remove(entity); foreach (var store in layerIndexToComponentStore.Values)
{
store.Remove(entity);
}
} }
public IEnumerable<GeneralRenderer> GeneralRenderersByLayer(int layer) public IEnumerable<GeneralRenderer> GeneralRenderersByLayer(int layer)
@ -98,7 +107,9 @@ namespace Encompass
public IEnumerable<(Entity, Type, IComponent)> AllInLayer(int layer) public IEnumerable<(Entity, Type, IComponent)> AllInLayer(int layer)
{ {
return layerIndexToComponentStore[layer].AllInterfaceTyped(); return layerIndexToComponentStore.ContainsKey(layer) ?
layerIndexToComponentStore[layer].AllInterfaceTyped() :
Enumerable.Empty<(Entity, Type, IComponent)>();
} }
} }
} }

View File

@ -20,7 +20,8 @@ namespace Encompass
{ {
private readonly List<Engine> engines = new List<Engine>(); private readonly List<Engine> engines = new List<Engine>();
private readonly DirectedGraph<Engine, Unit> engineGraph = GraphBuilder.DirectedGraph<Engine>(); private readonly DirectedGraph<Engine, Unit> engineGraph = GraphBuilder.DirectedGraph<Engine>();
private readonly ComponentStore componentStore = new ComponentStore(); private readonly ComponentStore startingComponentStoreForComponentManager = new ComponentStore();
private readonly ComponentStore startingComponentStoreForComponentMessageManager = new ComponentStore();
private readonly ComponentManager componentManager; private readonly ComponentManager componentManager;
private readonly EntityManager entityManager; private readonly EntityManager entityManager;
@ -76,7 +77,8 @@ namespace Encompass
/// </summary> /// </summary>
public void SetComponent<TComponent>(Entity entity, TComponent component) where TComponent : struct, IComponent public void SetComponent<TComponent>(Entity entity, TComponent component) where TComponent : struct, IComponent
{ {
componentStore.Set(entity, component); startingComponentStoreForComponentManager.Set(entity, component);
startingComponentStoreForComponentMessageManager.Set(entity, component);
if (component is IDrawableComponent drawableComponent) if (component is IDrawableComponent drawableComponent)
{ {
@ -348,7 +350,8 @@ namespace Encompass
renderManager renderManager
); );
componentManager.SetComponentStore(componentStore); componentManager.SetComponentStore(startingComponentStoreForComponentManager);
componentMessageManager.SetStartingComponentStore(startingComponentStoreForComponentMessageManager);
return world; return world;
} }