changes to component update handling
parent
b644f4fb4b
commit
1a17f9a8e1
|
@ -45,16 +45,17 @@ namespace Encompass
|
|||
|
||||
internal void AddExistingComponent<TComponent>(Entity entity, TComponent component) where TComponent : struct, IComponent
|
||||
{
|
||||
RegisterExistingOrImmediateComponentMessage(entity, component);
|
||||
|
||||
existingAndImmediateComponentStore.Set(entity.ID, component);
|
||||
existingComponentStore.Set(entity.ID, component);
|
||||
UpToDateComponentStore.Set(entity.ID, component);
|
||||
}
|
||||
|
||||
internal bool AddImmediateComponent<TComponent>(Entity entity, TComponent component, int priority) where TComponent : struct, IComponent
|
||||
{
|
||||
if (immediateComponentStore.Set(entity.ID, component, priority))
|
||||
{
|
||||
RegisterExistingOrImmediateComponentMessage(entity, component);
|
||||
existingAndImmediateComponentStore.Set(entity.ID, component);
|
||||
UpToDateComponentStore.Set(entity.ID, component);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -84,12 +85,6 @@ namespace Encompass
|
|||
return false;
|
||||
}
|
||||
|
||||
private void RegisterExistingOrImmediateComponentMessage<TComponent>(Entity entity, TComponent component) where TComponent : struct, IComponent
|
||||
{
|
||||
existingAndImmediateComponentStore.Set(entity.ID, component);
|
||||
UpToDateComponentStore.Set(entity.ID, component);
|
||||
}
|
||||
|
||||
public bool UpdateComponent<TComponent>(Entity entity, TComponent component, int priority) where TComponent : struct, IComponent
|
||||
{
|
||||
return UpToDateComponentStore.Set<TComponent>(entity.ID, component, priority);
|
||||
|
@ -157,6 +152,11 @@ namespace Encompass
|
|||
|
||||
// read components by entity and type
|
||||
|
||||
internal TComponent ReadImmediateOrExistingComponentByEntityAndType<TComponent>(Entity entity) where TComponent : struct, IComponent
|
||||
{
|
||||
return existingAndImmediateComponentStore.Get<TComponent>(entity.ID);
|
||||
}
|
||||
|
||||
internal TComponent ReadExistingComponentByEntityAndType<TComponent>(Entity entity) where TComponent : struct, IComponent
|
||||
{
|
||||
return existingComponentStore.Get<TComponent>(entity.ID);
|
||||
|
|
|
@ -316,18 +316,7 @@ namespace Encompass
|
|||
var existingRead = readTypes.Contains(typeof(TComponent));
|
||||
if (existingRead && immediateRead)
|
||||
{
|
||||
if (componentUpdateManager.HasImmediateComponent<TComponent>(entity))
|
||||
{
|
||||
return componentUpdateManager.ReadImmediateComponentByEntityAndType<TComponent>(entity);
|
||||
}
|
||||
else if (componentUpdateManager.HasExistingComponent<TComponent>(entity))
|
||||
{
|
||||
return componentUpdateManager.ReadExistingComponentByEntityAndType<TComponent>(entity);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new NoComponentOfTypeOnEntityException("No Component of type {0} exists on Entity {1}", typeof(TComponent).Name, entity.ID);
|
||||
}
|
||||
return componentUpdateManager.ReadImmediateOrExistingComponentByEntityAndType<TComponent>(entity);
|
||||
}
|
||||
else if (existingRead)
|
||||
{
|
||||
|
|
|
@ -1462,6 +1462,83 @@ namespace Tests
|
|||
|
||||
queriedEntities.ToArray().Should().BeEquivalentTo(new Entity[] { entityB });
|
||||
}
|
||||
|
||||
[ReadsImmediate(typeof(MockComponentB))]
|
||||
class ReadImmediateComponentsEngine : Engine
|
||||
{
|
||||
private List<MockComponentB> _components;
|
||||
|
||||
public ReadImmediateComponentsEngine(List<MockComponentB> components)
|
||||
{
|
||||
_components = components;
|
||||
}
|
||||
public override void Update(double dt)
|
||||
{
|
||||
_components.AddRange(ReadComponents<MockComponentB>());
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ReadImmediateComponents()
|
||||
{
|
||||
var worldBuilder = new WorldBuilder();
|
||||
|
||||
var _components = new List<MockComponentB>();
|
||||
|
||||
var entity = worldBuilder.CreateEntity();
|
||||
worldBuilder.SetComponent(entity, new MockComponent());
|
||||
|
||||
worldBuilder.AddEngine(new AddImmediateComponentEngine());
|
||||
worldBuilder.AddEngine(new ReadImmediateComponentsEngine(_components));
|
||||
|
||||
var world = worldBuilder.Build();
|
||||
world.Update(0.01);
|
||||
|
||||
_components.Should().NotBeEmpty();
|
||||
}
|
||||
|
||||
[ReadsImmediate(typeof(MockComponentB))]
|
||||
[Reads(typeof(MockComponent))]
|
||||
class HasAndGetImmediateComponentEngine : Engine
|
||||
{
|
||||
private List<MockComponentB> _components;
|
||||
|
||||
public HasAndGetImmediateComponentEngine(List<MockComponentB> components)
|
||||
{
|
||||
_components = components;
|
||||
}
|
||||
|
||||
public override void Update(double dt)
|
||||
{
|
||||
foreach (var (component, entity) in ReadComponentsIncludingEntity<MockComponent>())
|
||||
{
|
||||
if (HasComponent<MockComponentB>(entity))
|
||||
{
|
||||
_components.Add(GetComponent<MockComponentB>(entity));
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void HasAndGetImmediateComponent()
|
||||
{
|
||||
var worldBuilder = new WorldBuilder();
|
||||
|
||||
var _components = new List<MockComponentB>();
|
||||
|
||||
var entity = worldBuilder.CreateEntity();
|
||||
worldBuilder.SetComponent(entity, new MockComponent());
|
||||
|
||||
worldBuilder.AddEngine(new AddImmediateComponentEngine());
|
||||
worldBuilder.AddEngine(new HasAndGetImmediateComponentEngine(_components));
|
||||
|
||||
var world = worldBuilder.Build();
|
||||
world.Update(0.01);
|
||||
|
||||
_components.Should().NotBeEmpty();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue