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);
componentMessageManager.Remove<TComponent>(entity);
drawLayerManager.UnRegisterComponentWithLayer<TComponent>(entity);
}
private void Remove(Entity entity)

View File

@ -11,7 +11,7 @@ namespace Encompass
private readonly ComponentStore existingComponentStore = 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>>();
@ -30,6 +30,11 @@ namespace Encompass
}
}
internal void SetStartingComponentStore(ComponentStore componentStore)
{
upToDateComponentStore = componentStore;
}
internal void AddExistingComponentMessage<TComponent>(ComponentMessage<TComponent> componentMessage) where TComponent : struct, IComponent
{
RegisterExistingOrPendingComponentMessage(componentMessage.entity, componentMessage.component);

View File

@ -7,7 +7,6 @@ namespace Encompass
internal class DrawLayerManager
{
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, 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
{
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))
{
@ -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))
{
var layer = typeToEntityToLayer[typeof(TComponent)][entity];
@ -86,7 +92,10 @@ namespace Encompass
public void UnRegisterEntityWithLayer(Entity entity)
{
componentStore.Remove(entity);
foreach (var store in layerIndexToComponentStore.Values)
{
store.Remove(entity);
}
}
public IEnumerable<GeneralRenderer> GeneralRenderersByLayer(int layer)
@ -98,7 +107,9 @@ namespace Encompass
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 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 EntityManager entityManager;
@ -76,7 +77,8 @@ namespace Encompass
/// </summary>
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)
{
@ -348,7 +350,8 @@ namespace Encompass
renderManager
);
componentManager.SetComponentStore(componentStore);
componentManager.SetComponentStore(startingComponentStoreForComponentManager);
componentMessageManager.SetStartingComponentStore(startingComponentStoreForComponentMessageManager);
return world;
}