runtime type HasComponent
parent
0920b9a8f7
commit
591cd980d9
|
@ -268,16 +268,31 @@ namespace Encompass
|
||||||
return entityToTypeToComponentID.ContainsKey(entity) && entityToTypeToComponentID[entity].ContainsKey(typeof(TComponent));
|
return entityToTypeToComponentID.ContainsKey(entity) && entityToTypeToComponentID[entity].ContainsKey(typeof(TComponent));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal bool HasExistingOrPendingComponent(Entity entity, Type type)
|
||||||
|
{
|
||||||
|
return entityToTypeToComponentID.ContainsKey(entity) && entityToTypeToComponentID[entity].ContainsKey(type);
|
||||||
|
}
|
||||||
|
|
||||||
internal bool HasExistingComponent<TComponent>(Entity entity) where TComponent : struct, IComponent
|
internal bool HasExistingComponent<TComponent>(Entity entity) where TComponent : struct, IComponent
|
||||||
{
|
{
|
||||||
return entityToTypeToExistingComponentID.ContainsKey(entity) && entityToTypeToExistingComponentID[entity].ContainsKey(typeof(TComponent));
|
return entityToTypeToExistingComponentID.ContainsKey(entity) && entityToTypeToExistingComponentID[entity].ContainsKey(typeof(TComponent));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal bool HasExistingComponent(Entity entity, Type type)
|
||||||
|
{
|
||||||
|
return entityToTypeToExistingComponentID.ContainsKey(entity) && entityToTypeToExistingComponentID[entity].ContainsKey(type);
|
||||||
|
}
|
||||||
|
|
||||||
internal bool HasPendingComponent<TComponent>(Entity entity) where TComponent : struct, IComponent
|
internal bool HasPendingComponent<TComponent>(Entity entity) where TComponent : struct, IComponent
|
||||||
{
|
{
|
||||||
return entityToTypeToPendingComponentID.ContainsKey(entity) && entityToTypeToPendingComponentID[entity].ContainsKey(typeof(TComponent));
|
return entityToTypeToPendingComponentID.ContainsKey(entity) && entityToTypeToPendingComponentID[entity].ContainsKey(typeof(TComponent));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal bool HasPendingComponent(Entity entity, Type type)
|
||||||
|
{
|
||||||
|
return entityToTypeToPendingComponentID.ContainsKey(entity) && entityToTypeToPendingComponentID[entity].ContainsKey(type);
|
||||||
|
}
|
||||||
|
|
||||||
internal IComponent GetComponentByID(Guid componentID)
|
internal IComponent GetComponentByID(Guid componentID)
|
||||||
{
|
{
|
||||||
if (componentIDToComponent.ContainsKey(componentID))
|
if (componentIDToComponent.ContainsKey(componentID))
|
||||||
|
|
|
@ -362,6 +362,38 @@ namespace Encompass
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns true if the Entity has a Component of the given Type.
|
||||||
|
/// </summary>
|
||||||
|
/// <exception cref="Encompass.Exceptions.IllegalReadException">
|
||||||
|
/// Thrown when the Engine does not declare that is Reads the given Component Type.
|
||||||
|
/// </exception>
|
||||||
|
protected bool HasComponent(Entity entity, Type type)
|
||||||
|
{
|
||||||
|
var pending = typeof(PendingComponentMessage<>).MakeGenericType(type);
|
||||||
|
var existing = typeof(ComponentMessage<>).MakeGenericType(type);
|
||||||
|
|
||||||
|
var pendingRead = receiveTypes.Contains(pending);
|
||||||
|
var existingRead = receiveTypes.Contains(existing);
|
||||||
|
|
||||||
|
if (pendingRead && existingRead)
|
||||||
|
{
|
||||||
|
return componentMessageManager.HasExistingOrPendingComponent(entity, type);
|
||||||
|
}
|
||||||
|
else if (existingRead)
|
||||||
|
{
|
||||||
|
return componentMessageManager.HasExistingComponent(entity, type);
|
||||||
|
}
|
||||||
|
else if (pendingRead)
|
||||||
|
{
|
||||||
|
return componentMessageManager.HasPendingComponent(entity, type);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new IllegalReadException("Engine {0} tried to read undeclared Component {1}", GetType().Name, type.Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets Component data for the specified Component Type on the specified Entity. If Component data for this Type already existed on the Entity, the component data is overwritten.
|
/// Sets Component data for the specified Component Type on the specified Entity. If Component data for this Type already existed on the Entity, the component data is overwritten.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -312,6 +312,42 @@ namespace Tests
|
||||||
world.Update(0.01);
|
world.Update(0.01);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Receives(typeof(HasComponentTestMessage))]
|
||||||
|
[Reads(typeof(MockComponent))]
|
||||||
|
class HasComponentWithRuntimeTypeEngine : Engine
|
||||||
|
{
|
||||||
|
public override void Update(double dt)
|
||||||
|
{
|
||||||
|
foreach (var hasComponentTestEngine in ReadMessages<HasComponentTestMessage>())
|
||||||
|
{
|
||||||
|
Assert.IsTrue(HasComponent(hasComponentTestEngine.entity, typeof(MockComponent)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void HasComponentWithRuntimeType()
|
||||||
|
{
|
||||||
|
var worldBuilder = new WorldBuilder();
|
||||||
|
worldBuilder.AddEngine(new HasComponentWithRuntimeTypeEngine());
|
||||||
|
|
||||||
|
var entity = worldBuilder.CreateEntity();
|
||||||
|
|
||||||
|
MockComponent mockComponent;
|
||||||
|
mockComponent.myInt = 3;
|
||||||
|
mockComponent.myString = "hello";
|
||||||
|
|
||||||
|
worldBuilder.SetComponent(entity, mockComponent);
|
||||||
|
|
||||||
|
HasComponentTestMessage hasComponentTestMessage;
|
||||||
|
hasComponentTestMessage.entity = entity;
|
||||||
|
worldBuilder.SendMessage(hasComponentTestMessage);
|
||||||
|
|
||||||
|
var world = worldBuilder.Build();
|
||||||
|
|
||||||
|
world.Update(0.01);
|
||||||
|
}
|
||||||
|
|
||||||
struct RemoveComponentTestMessage : IMessage
|
struct RemoveComponentTestMessage : IMessage
|
||||||
{
|
{
|
||||||
public Entity entity;
|
public Entity entity;
|
||||||
|
|
Loading…
Reference in New Issue