fix bugs in component storage and draw layer manager
continuous-integration/drone/push Build is failing
Details
continuous-integration/drone/push Build is failing
Details
parent
4178e8f02c
commit
150043b0e5
|
@ -25,7 +25,7 @@ namespace Encompass
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Set<TComponent>(int entityID, TComponent component) where TComponent : struct
|
public void Set<TComponent>(int entityID, in TComponent component) where TComponent : struct
|
||||||
{
|
{
|
||||||
_store.Set(entityID, component);
|
_store.Set(entityID, component);
|
||||||
RegisterComponentType<TComponent>();
|
RegisterComponentType<TComponent>();
|
||||||
|
|
|
@ -48,18 +48,18 @@ namespace Encompass
|
||||||
return ComponentBitSet.EntityBitArray(entityID);
|
return ComponentBitSet.EntityBitArray(entityID);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ref readonly TComponent Get<TComponent>(int entityID) where TComponent : struct
|
public ref TComponent Get<TComponent>(int entityID) where TComponent : struct
|
||||||
{
|
{
|
||||||
return ref Lookup<TComponent>().Get(entityID);
|
return ref Lookup<TComponent>().Get(entityID);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Set<TComponent>(int entityID, TComponent component) where TComponent : struct
|
public void Set<TComponent>(int entityID, in TComponent component) where TComponent : struct
|
||||||
{
|
{
|
||||||
Lookup<TComponent>().Set(entityID, component);
|
Lookup<TComponent>().Set(entityID, component);
|
||||||
ComponentBitSet.Set<TComponent>(entityID);
|
ComponentBitSet.Set<TComponent>(entityID);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Set<TComponent>(int entityID, TComponent component, int priority) where TComponent : struct
|
public bool Set<TComponent>(int entityID, in TComponent component, int priority) where TComponent : struct
|
||||||
{
|
{
|
||||||
if (Lookup<TComponent>().Set(entityID, component, priority))
|
if (Lookup<TComponent>().Set(entityID, component, priority))
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
|
@ -14,7 +13,7 @@ namespace Encompass
|
||||||
public abstract void ClearPriorities();
|
public abstract void ClearPriorities();
|
||||||
}
|
}
|
||||||
|
|
||||||
internal unsafe class TypedComponentStore<TComponent> : TypedComponentStore where TComponent : struct
|
internal class TypedComponentStore<TComponent> : TypedComponentStore where TComponent : struct
|
||||||
{
|
{
|
||||||
private readonly Dictionary<int, int> _indices = new Dictionary<int, int>(512);
|
private readonly Dictionary<int, int> _indices = new Dictionary<int, int>(512);
|
||||||
private readonly Dictionary<int, int> _priorities = new Dictionary<int, int>(512);
|
private readonly Dictionary<int, int> _priorities = new Dictionary<int, int>(512);
|
||||||
|
@ -23,18 +22,18 @@ namespace Encompass
|
||||||
|
|
||||||
public override int Count { get => _indices.Count; }
|
public override int Count { get => _indices.Count; }
|
||||||
|
|
||||||
public unsafe ref readonly TComponent Get(int entityID)
|
public ref TComponent Get(int entityID)
|
||||||
{
|
{
|
||||||
if (!_indices.ContainsKey(entityID)) { throw new Exceptions.NoComponentOfTypeOnEntityException("No component of type {0} exists on Entity with ID {1}", typeof(TComponent), entityID); }
|
if (!_indices.ContainsKey(entityID)) { throw new Exceptions.NoComponentOfTypeOnEntityException("No component of type {0} exists on Entity with ID {1}", typeof(TComponent), entityID); }
|
||||||
return ref _components[_indices[entityID]];
|
return ref _components[_indices[entityID]];
|
||||||
}
|
}
|
||||||
|
|
||||||
public unsafe void Set(int entityID, TComponent component)
|
public void Set(int entityID, in TComponent component)
|
||||||
{
|
{
|
||||||
InternalSet(entityID, component);
|
InternalSet(entityID, component);
|
||||||
}
|
}
|
||||||
|
|
||||||
public unsafe bool Set(int entityID, TComponent component, int priority)
|
public bool Set(int entityID, in TComponent component, int priority)
|
||||||
{
|
{
|
||||||
if (!_priorities.ContainsKey(entityID) || priority < _priorities[entityID])
|
if (!_priorities.ContainsKey(entityID) || priority < _priorities[entityID])
|
||||||
{
|
{
|
||||||
|
@ -46,7 +45,7 @@ namespace Encompass
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private unsafe void InternalSet(int entityID, TComponent component)
|
private unsafe void InternalSet(int entityID, in TComponent component)
|
||||||
{
|
{
|
||||||
if (!_indices.ContainsKey(entityID))
|
if (!_indices.ContainsKey(entityID))
|
||||||
{
|
{
|
||||||
|
@ -70,9 +69,12 @@ namespace Encompass
|
||||||
|
|
||||||
public override void ForceRemove(int entityID)
|
public override void ForceRemove(int entityID)
|
||||||
{
|
{
|
||||||
_indices.Remove(entityID);
|
if (_indices.ContainsKey(entityID))
|
||||||
_priorities.Remove(entityID);
|
{
|
||||||
_idManager.Free(entityID);
|
_idManager.Free(_indices[entityID]);
|
||||||
|
_indices.Remove(entityID);
|
||||||
|
_priorities.Remove(entityID);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool Has(int entityID)
|
public override bool Has(int entityID)
|
||||||
|
@ -82,9 +84,9 @@ namespace Encompass
|
||||||
|
|
||||||
public override void Clear()
|
public override void Clear()
|
||||||
{
|
{
|
||||||
foreach (var entityID in _indices.Keys)
|
foreach (var mappedID in _indices.Values)
|
||||||
{
|
{
|
||||||
_idManager.Free(entityID);
|
_idManager.Free(mappedID);
|
||||||
}
|
}
|
||||||
_indices.Clear();
|
_indices.Clear();
|
||||||
_priorities.Clear();
|
_priorities.Clear();
|
||||||
|
|
|
@ -61,7 +61,7 @@ namespace Encompass
|
||||||
_replayStore.ClearAll();
|
_replayStore.ClearAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
internal bool AddImmediateComponent<TComponent>(int entityID, TComponent component, int priority) where TComponent : struct
|
internal bool AddImmediateComponent<TComponent>(int entityID, in TComponent component, int priority) where TComponent : struct
|
||||||
{
|
{
|
||||||
if (_immediateComponentStore.Set(entityID, component, priority))
|
if (_immediateComponentStore.Set(entityID, component, priority))
|
||||||
{
|
{
|
||||||
|
@ -73,14 +73,14 @@ namespace Encompass
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void AddImmediateComponent<TComponent>(int entityID, TComponent component) where TComponent : struct
|
internal void AddImmediateComponent<TComponent>(int entityID, in TComponent component) where TComponent : struct
|
||||||
{
|
{
|
||||||
_immediateComponentStore.Set(entityID, component);
|
_immediateComponentStore.Set(entityID, component);
|
||||||
_replayStore.Set(entityID, component);
|
_replayStore.Set(entityID, component);
|
||||||
_upToDateComponentStore.Set(entityID, component);
|
_upToDateComponentStore.Set(entityID, component);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal bool UpdateComponent<TComponent>(int entityID, TComponent component, int priority) where TComponent : struct
|
internal bool UpdateComponent<TComponent>(int entityID, in TComponent component, int priority) where TComponent : struct
|
||||||
{
|
{
|
||||||
var result = _upToDateComponentStore.Set(entityID, component, priority);
|
var result = _upToDateComponentStore.Set(entityID, component, priority);
|
||||||
if (result)
|
if (result)
|
||||||
|
@ -90,7 +90,7 @@ namespace Encompass
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void AddComponent<TComponent>(int entityID, TComponent component) where TComponent : struct
|
internal void AddComponent<TComponent>(int entityID, in TComponent component) where TComponent : struct
|
||||||
{
|
{
|
||||||
_upToDateComponentStore.Set(entityID, component);
|
_upToDateComponentStore.Set(entityID, component);
|
||||||
_replayStore.Set(entityID, component);
|
_replayStore.Set(entityID, component);
|
||||||
|
@ -153,17 +153,17 @@ namespace Encompass
|
||||||
|
|
||||||
// component getters
|
// component getters
|
||||||
|
|
||||||
internal ref readonly TComponent ReadImmediateOrExistingComponentByEntityAndType<TComponent>(int entityID) where TComponent : struct
|
internal ref TComponent ReadImmediateOrExistingComponentByEntityAndType<TComponent>(int entityID) where TComponent : struct
|
||||||
{
|
{
|
||||||
return ref _upToDateComponentStore.Get<TComponent>(entityID);
|
return ref _upToDateComponentStore.Get<TComponent>(entityID);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal ref readonly TComponent ReadExistingComponentByEntityAndType<TComponent>(int entityID) where TComponent : struct
|
internal ref TComponent ReadExistingComponentByEntityAndType<TComponent>(int entityID) where TComponent : struct
|
||||||
{
|
{
|
||||||
return ref _existingComponentStore.Get<TComponent>(entityID);
|
return ref _existingComponentStore.Get<TComponent>(entityID);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal ref readonly TComponent ReadImmediateComponentByEntityAndType<TComponent>(int entityID) where TComponent : struct
|
internal ref TComponent ReadImmediateComponentByEntityAndType<TComponent>(int entityID) where TComponent : struct
|
||||||
{
|
{
|
||||||
return ref _immediateComponentStore.Get<TComponent>(entityID);
|
return ref _immediateComponentStore.Get<TComponent>(entityID);
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,9 +97,16 @@ namespace Encompass
|
||||||
{
|
{
|
||||||
foreach (var store in _layerIndexToTypeToID.Values)
|
foreach (var store in _layerIndexToTypeToID.Values)
|
||||||
{
|
{
|
||||||
foreach (var set in store.Values)
|
foreach (var typeToSet in store)
|
||||||
{
|
{
|
||||||
set.Remove(entityID);
|
var type = typeToSet.Key;
|
||||||
|
var set = typeToSet.Value;
|
||||||
|
|
||||||
|
if (set.Contains(entityID))
|
||||||
|
{
|
||||||
|
_typeToEntityToLayer[type].Remove(entityID);
|
||||||
|
set.Remove(entityID);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -344,7 +344,7 @@ namespace Encompass
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private ref readonly TComponent GetComponentHelper<TComponent>(int entityID) where TComponent : struct
|
private ref TComponent GetComponentHelper<TComponent>(int entityID) where TComponent : struct
|
||||||
{
|
{
|
||||||
var immediateRead = ReadImmediateTypes.Contains(typeof(TComponent));
|
var immediateRead = ReadImmediateTypes.Contains(typeof(TComponent));
|
||||||
var existingRead = ReadTypes.Contains(typeof(TComponent));
|
var existingRead = ReadTypes.Contains(typeof(TComponent));
|
||||||
|
@ -380,6 +380,20 @@ namespace Encompass
|
||||||
return ref GetComponentHelper<TComponent>(entity.ID);
|
return ref GetComponentHelper<TComponent>(entity.ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns a Component by reference with the specified Type that exists on the Entity.
|
||||||
|
/// </summary>
|
||||||
|
/// <exception cref="Encompass.Exceptions.NoComponentOfTypeOnEntityException">
|
||||||
|
/// Thrown when the Entity does not have a Component of the specified Type
|
||||||
|
/// </exception>
|
||||||
|
/// <exception cref="Encompass.Exceptions.IllegalReadException">
|
||||||
|
/// Thrown when the Engine does not declare that it reads the given Component Type.
|
||||||
|
/// </exception>
|
||||||
|
protected ref TComponent GetComponentMutable<TComponent>(Entity entity) where TComponent : struct
|
||||||
|
{
|
||||||
|
return ref GetComponentHelper<TComponent>(entity.ID);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns true if the Entity has a Component of the given Type.
|
/// Returns true if the Entity has a Component of the given Type.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -444,7 +458,7 @@ namespace Encompass
|
||||||
/// <exception cref="Encompass.Exceptions.IllegalWriteException">
|
/// <exception cref="Encompass.Exceptions.IllegalWriteException">
|
||||||
/// Thrown when the Engine does not declare that it Writes the given Component Type.
|
/// Thrown when the Engine does not declare that it Writes the given Component Type.
|
||||||
/// </exception>
|
/// </exception>
|
||||||
protected void SetComponent<TComponent>(Entity entity, TComponent component) where TComponent : struct
|
protected void SetComponent<TComponent>(Entity entity, in TComponent component) where TComponent : struct
|
||||||
{
|
{
|
||||||
var priority = WritePriorities.ContainsKey(typeof(TComponent)) ? WritePriorities[typeof(TComponent)] : DefaultWritePriority;
|
var priority = WritePriorities.ContainsKey(typeof(TComponent)) ? WritePriorities[typeof(TComponent)] : DefaultWritePriority;
|
||||||
|
|
||||||
|
@ -484,7 +498,7 @@ namespace Encompass
|
||||||
/// <exception cref="Encompass.Exceptions.IllegalWriteException">
|
/// <exception cref="Encompass.Exceptions.IllegalWriteException">
|
||||||
/// Thrown when the Engine does not declare that it Writes the given Component Type.
|
/// Thrown when the Engine does not declare that it Writes the given Component Type.
|
||||||
/// </exception>
|
/// </exception>
|
||||||
protected void AddComponent<TComponent>(Entity entity, TComponent component) where TComponent : struct
|
protected void AddComponent<TComponent>(Entity entity, in TComponent component) where TComponent : struct
|
||||||
{
|
{
|
||||||
if (!EntityCreatedThisFrame(entity.ID))
|
if (!EntityCreatedThisFrame(entity.ID))
|
||||||
{
|
{
|
||||||
|
|
|
@ -11,7 +11,8 @@ namespace Encompass
|
||||||
|
|
||||||
internal void InternalRender(Entity entity)
|
internal void InternalRender(Entity entity)
|
||||||
{
|
{
|
||||||
Render(entity, GetComponent<TComponent>(entity));
|
ref readonly var component = ref GetComponent<TComponent>(entity);
|
||||||
|
Render(entity, component);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -84,7 +84,7 @@ namespace Encompass
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets Component data for the specified Component Type on the specified Entity.
|
/// Sets Component data for the specified Component Type on the specified Entity.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void SetComponent<TComponent>(Entity entity, TComponent component) where TComponent : struct
|
public void SetComponent<TComponent>(Entity entity, in TComponent component) where TComponent : struct
|
||||||
{
|
{
|
||||||
RegisterComponentType<TComponent>();
|
RegisterComponentType<TComponent>();
|
||||||
_startingExistingComponentStore.Set(entity.ID, component);
|
_startingExistingComponentStore.Set(entity.ID, component);
|
||||||
|
|
Loading…
Reference in New Issue