61 lines
1.9 KiB
C#
61 lines
1.9 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
|
|
namespace Encompass
|
|
{
|
|
internal class ComponentDeltaStore : ComponentStore
|
|
{
|
|
private readonly Dictionary<Type, Replayer> _replayers = new Dictionary<Type, Replayer>();
|
|
private readonly HashSet<Replayer> _currentReplayers = new HashSet<Replayer>();
|
|
|
|
public IEnumerable<Replayer> CurrentReplayers { get { return _currentReplayers; } }
|
|
|
|
public ComponentDeltaStore(Dictionary<Type, int> typeToIndex) : base(typeToIndex)
|
|
{
|
|
}
|
|
|
|
public override void RegisterComponentType<TComponent>()
|
|
{
|
|
base.RegisterComponentType<TComponent>();
|
|
if (!_replayers.ContainsKey(typeof(TComponent)))
|
|
{
|
|
_replayers.Add(typeof(TComponent), new Replayer<TComponent>(this));
|
|
}
|
|
}
|
|
|
|
public override bool Set<TComponent>(int entityID, TComponent component, int priority)
|
|
{
|
|
var result = base.Set(entityID, component, priority);
|
|
if (result)
|
|
{
|
|
var replayer = _replayers[typeof(TComponent)];
|
|
_currentReplayers.Add(replayer);
|
|
replayer.UnMarkRemoval(entityID);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public override bool Remove<TComponent>(int entityID, int priority)
|
|
{
|
|
var result = base.Remove<TComponent>(entityID, priority);
|
|
if (result)
|
|
{
|
|
var replayer = _replayers[typeof(TComponent)];
|
|
_currentReplayers.Add(replayer);
|
|
replayer.MarkRemoval(entityID);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public override void ClearAll()
|
|
{
|
|
base.ClearAll();
|
|
foreach (var replayer in _currentReplayers)
|
|
{
|
|
replayer.Clear();
|
|
}
|
|
_currentReplayers.Clear();
|
|
}
|
|
}
|
|
}
|