2019-12-20 19:10:42 +00:00
using System ;
2019-06-14 03:28:26 +00:00
using System.Collections.Generic ;
2019-06-16 01:05:56 +00:00
namespace Encompass
{
internal class ComponentManager
{
2020-03-20 07:09:57 +00:00
private readonly DrawLayerManager _drawLayerManager ;
2019-06-20 00:40:01 +00:00
2020-03-20 07:09:57 +00:00
private readonly ComponentStore _existingComponentStore ;
private readonly ComponentStore _immediateComponentStore ;
private readonly ComponentDeltaStore _replayStore ;
private readonly ComponentStore _upToDateComponentStore ;
2019-12-29 21:24:51 +00:00
public Dictionary < Type , int > TypeToIndex { get ; }
2020-03-20 07:09:57 +00:00
private readonly HashSet < int > _entitiesMarkedForRemoval = new HashSet < int > ( ) ;
2019-07-18 01:53:31 +00:00
2020-03-20 07:09:57 +00:00
internal ComponentBitSet ImmediateBits { get { return _immediateComponentStore . ComponentBitSet ; } }
internal ComponentBitSet ExistingBits { get { return _existingComponentStore . ComponentBitSet ; } }
2019-12-28 21:53:02 +00:00
2019-12-29 21:24:51 +00:00
public ComponentManager ( DrawLayerManager drawLayerManager , Dictionary < Type , int > typeToIndex )
2019-06-19 23:13:02 +00:00
{
2020-03-20 07:09:57 +00:00
this . _drawLayerManager = drawLayerManager ;
_existingComponentStore = new ComponentStore ( typeToIndex ) ;
_immediateComponentStore = new ComponentStore ( typeToIndex ) ;
_replayStore = new ComponentDeltaStore ( typeToIndex ) ;
_upToDateComponentStore = new ComponentStore ( typeToIndex ) ;
2019-12-29 21:24:51 +00:00
TypeToIndex = typeToIndex ;
2019-06-19 23:13:02 +00:00
}
2020-03-22 00:38:35 +00:00
public void RegisterComponentType < TComponent > ( ) where TComponent : struct
2019-12-16 07:28:02 +00:00
{
2020-03-20 07:09:57 +00:00
_existingComponentStore . RegisterComponentType < TComponent > ( ) ;
_immediateComponentStore . RegisterComponentType < TComponent > ( ) ;
_replayStore . RegisterComponentType < TComponent > ( ) ;
_upToDateComponentStore . RegisterComponentType < TComponent > ( ) ;
2019-12-16 07:28:02 +00:00
}
2019-12-30 01:37:19 +00:00
internal void SetExistingComponentStore ( ComponentStore componentStore )
2019-06-16 01:05:56 +00:00
{
2020-03-20 07:09:57 +00:00
_existingComponentStore . SwapWith ( componentStore ) ;
2019-08-11 00:34:00 +00:00
}
2019-12-30 01:37:19 +00:00
internal void SetUpToDateComponentStore ( ComponentStore componentStore )
{
2020-03-20 07:09:57 +00:00
_upToDateComponentStore . SwapWith ( componentStore ) ;
2019-12-30 01:37:19 +00:00
}
2020-03-22 00:38:35 +00:00
internal void RegisterDrawableComponent < TComponent > ( int entityID , int layer ) where TComponent : struct
2019-08-11 00:34:00 +00:00
{
2020-03-20 07:58:33 +00:00
_drawLayerManager . RegisterComponentWithLayer < TComponent > ( entityID , layer ) ;
2019-08-11 00:34:00 +00:00
}
2019-12-29 21:24:51 +00:00
internal void WriteComponents ( )
2019-08-21 22:13:48 +00:00
{
2020-03-20 07:09:57 +00:00
_existingComponentStore . UpdateUsing ( _replayStore ) ;
_existingComponentStore . ClearAllPriorities ( ) ;
_upToDateComponentStore . ClearAllPriorities ( ) ;
_immediateComponentStore . ClearAll ( ) ;
_replayStore . ClearAll ( ) ;
2019-12-29 21:24:51 +00:00
}
2020-03-22 05:19:31 +00:00
internal bool AddImmediateComponent < TComponent > ( int entityID , in TComponent component , int priority ) where TComponent : struct
2019-12-29 21:24:51 +00:00
{
2020-03-20 07:09:57 +00:00
if ( _immediateComponentStore . Set ( entityID , component , priority ) )
2019-12-29 21:24:51 +00:00
{
2020-03-20 07:09:57 +00:00
_replayStore . Set ( entityID , component ) ;
_upToDateComponentStore . Set ( entityID , component ) ;
2019-12-29 21:24:51 +00:00
return true ;
}
return false ;
}
2020-03-22 05:19:31 +00:00
internal void AddImmediateComponent < TComponent > ( int entityID , in TComponent component ) where TComponent : struct
2020-03-17 22:29:16 +00:00
{
2020-03-20 07:09:57 +00:00
_immediateComponentStore . Set ( entityID , component ) ;
_replayStore . Set ( entityID , component ) ;
_upToDateComponentStore . Set ( entityID , component ) ;
2020-03-17 22:29:16 +00:00
}
2020-03-22 05:19:31 +00:00
internal bool UpdateComponent < TComponent > ( int entityID , in TComponent component , int priority ) where TComponent : struct
2019-12-29 21:24:51 +00:00
{
2020-03-20 07:09:57 +00:00
var result = _upToDateComponentStore . Set ( entityID , component , priority ) ;
2019-12-30 03:08:32 +00:00
if ( result )
{
2020-03-20 07:09:57 +00:00
_replayStore . Set ( entityID , component ) ;
2019-12-30 03:08:32 +00:00
}
return result ;
2019-12-29 21:24:51 +00:00
}
2020-03-22 05:19:31 +00:00
internal void AddComponent < TComponent > ( int entityID , in TComponent component ) where TComponent : struct
2020-03-17 22:29:16 +00:00
{
2020-03-20 07:09:57 +00:00
_upToDateComponentStore . Set ( entityID , component ) ;
_replayStore . Set ( entityID , component ) ;
2020-03-17 22:29:16 +00:00
}
2019-12-29 21:24:51 +00:00
// existing or immediate reads
2020-03-22 00:38:35 +00:00
internal IEnumerable < ( TComponent , int ) > ReadExistingAndImmediateComponentsByType < TComponent > ( ) where TComponent : struct
2019-12-29 21:24:51 +00:00
{
2020-03-20 07:09:57 +00:00
return _upToDateComponentStore . All < TComponent > ( ) ;
2019-12-29 21:24:51 +00:00
}
2020-03-22 00:38:35 +00:00
internal ( TComponent , int ) ReadFirstExistingOrImmediateComponentByType < TComponent > ( ) where TComponent : struct
2019-12-29 21:24:51 +00:00
{
if ( ! SomeExistingOrImmediateComponent < TComponent > ( ) ) { throw new Exceptions . NoComponentOfTypeException ( $"No Component with type {typeof(TComponent)} exists" ) ; }
var enumerator = ReadExistingAndImmediateComponentsByType < TComponent > ( ) . GetEnumerator ( ) ;
enumerator . MoveNext ( ) ;
return enumerator . Current ;
}
2020-03-22 00:38:35 +00:00
internal bool SomeExistingOrImmediateComponent < TComponent > ( ) where TComponent : struct
2019-12-29 21:24:51 +00:00
{
2020-03-20 07:09:57 +00:00
return _upToDateComponentStore . Any < TComponent > ( ) ;
2019-12-29 21:24:51 +00:00
}
// existing reads
2020-03-22 00:38:35 +00:00
internal ( TComponent , int ) ReadFirstExistingComponentByType < TComponent > ( ) where TComponent : struct
2019-12-29 21:24:51 +00:00
{
if ( ! SomeExistingComponent < TComponent > ( ) ) { throw new Exceptions . NoComponentOfTypeException ( $"No Component with type {typeof(TComponent)} exists" ) ; }
var enumerator = GetComponentsIncludingEntity < TComponent > ( ) . GetEnumerator ( ) ;
enumerator . MoveNext ( ) ;
return enumerator . Current ;
}
2020-03-22 00:38:35 +00:00
internal bool SomeExistingComponent < TComponent > ( ) where TComponent : struct
2019-12-29 21:24:51 +00:00
{
2020-03-20 07:09:57 +00:00
return _existingComponentStore . Any < TComponent > ( ) ;
2019-12-29 21:24:51 +00:00
}
// immediate reads
2020-03-22 00:38:35 +00:00
internal IEnumerable < ( TComponent , int ) > ReadImmediateComponentsByType < TComponent > ( ) where TComponent : struct
2019-12-29 21:24:51 +00:00
{
2020-03-20 07:09:57 +00:00
return _immediateComponentStore . All < TComponent > ( ) ;
2019-12-29 21:24:51 +00:00
}
2020-03-22 00:38:35 +00:00
internal ( TComponent , int ) ReadFirstImmediateComponentByType < TComponent > ( ) where TComponent : struct
2019-12-29 21:24:51 +00:00
{
if ( ! SomeImmediateComponent < TComponent > ( ) ) { throw new Exceptions . NoComponentOfTypeException ( $"No Component with type {typeof(TComponent)} exists" ) ; }
var enumerator = ReadImmediateComponentsByType < TComponent > ( ) . GetEnumerator ( ) ;
enumerator . MoveNext ( ) ;
return enumerator . Current ;
}
2020-03-22 00:38:35 +00:00
internal bool SomeImmediateComponent < TComponent > ( ) where TComponent : struct
2019-12-29 21:24:51 +00:00
{
2020-03-20 07:09:57 +00:00
return _immediateComponentStore . Any < TComponent > ( ) ;
2019-12-29 21:24:51 +00:00
}
// component getters
2020-03-22 05:19:31 +00:00
internal ref TComponent ReadImmediateOrExistingComponentByEntityAndType < TComponent > ( int entityID ) where TComponent : struct
2019-12-29 21:24:51 +00:00
{
2020-03-20 07:09:57 +00:00
return ref _upToDateComponentStore . Get < TComponent > ( entityID ) ;
2019-12-29 21:24:51 +00:00
}
2020-03-22 05:19:31 +00:00
internal ref TComponent ReadExistingComponentByEntityAndType < TComponent > ( int entityID ) where TComponent : struct
2019-12-29 21:24:51 +00:00
{
2020-03-20 07:09:57 +00:00
return ref _existingComponentStore . Get < TComponent > ( entityID ) ;
2019-12-29 21:24:51 +00:00
}
2020-03-22 05:19:31 +00:00
internal ref TComponent ReadImmediateComponentByEntityAndType < TComponent > ( int entityID ) where TComponent : struct
2019-12-29 21:24:51 +00:00
{
2020-03-20 07:09:57 +00:00
return ref _immediateComponentStore . Get < TComponent > ( entityID ) ;
2019-12-29 21:24:51 +00:00
}
// has checkers
2020-03-22 00:38:35 +00:00
internal bool HasExistingOrImmediateComponent < TComponent > ( int entityID ) where TComponent : struct
2019-06-20 05:38:56 +00:00
{
2020-03-20 07:09:57 +00:00
return _upToDateComponentStore . Has < TComponent > ( entityID ) ;
2019-12-29 21:24:51 +00:00
}
2019-12-29 21:54:08 +00:00
internal bool HasExistingOrImmediateComponent ( int entityID , Type type )
2019-12-29 21:24:51 +00:00
{
2020-03-20 07:09:57 +00:00
return _upToDateComponentStore . Has ( type , entityID ) ;
2019-12-29 21:24:51 +00:00
}
2020-03-22 00:38:35 +00:00
internal bool HasExistingComponent < TComponent > ( int entityID ) where TComponent : struct
2019-12-29 21:24:51 +00:00
{
2020-03-20 07:09:57 +00:00
return _existingComponentStore . Has < TComponent > ( entityID ) ;
2019-12-29 21:24:51 +00:00
}
2019-12-29 21:54:08 +00:00
internal bool HasExistingComponent ( int entityID , Type type )
2019-12-29 21:24:51 +00:00
{
2020-03-20 07:09:57 +00:00
return _existingComponentStore . Has ( type , entityID ) ;
2019-12-29 21:24:51 +00:00
}
2020-03-22 00:38:35 +00:00
internal bool HasImmediateComponent < TComponent > ( int entityID ) where TComponent : struct
2019-12-29 21:24:51 +00:00
{
2020-03-20 07:09:57 +00:00
return _immediateComponentStore . Has < TComponent > ( entityID ) ;
2019-12-29 21:24:51 +00:00
}
2019-12-29 21:54:08 +00:00
internal bool HasImmediateComponent ( int entityID , Type type )
2019-12-29 21:24:51 +00:00
{
2020-03-20 07:09:57 +00:00
return _immediateComponentStore . Has ( type , entityID ) ;
2019-12-05 22:59:55 +00:00
}
2019-06-14 03:28:26 +00:00
2020-03-22 00:38:35 +00:00
internal IEnumerable < ( TComponent , int ) > GetComponentsIncludingEntity < TComponent > ( ) where TComponent : struct
2019-12-05 22:59:55 +00:00
{
2020-03-20 07:09:57 +00:00
return _existingComponentStore . All < TComponent > ( ) ;
2019-08-11 00:34:00 +00:00
}
2019-08-02 06:09:41 +00:00
2020-03-22 00:38:35 +00:00
internal IEnumerable < TComponent > GetComponentsByType < TComponent > ( ) where TComponent : struct
2019-06-19 21:14:44 +00:00
{
2020-03-20 07:09:57 +00:00
foreach ( var pair in _existingComponentStore . All < TComponent > ( ) )
2019-12-17 04:40:15 +00:00
{
yield return pair . Item1 ;
}
2019-06-19 21:14:44 +00:00
}
2020-03-22 00:38:35 +00:00
internal ref readonly TComponent GetComponentByEntityAndType < TComponent > ( int entityID ) where TComponent : struct
2019-06-16 01:05:56 +00:00
{
2020-03-20 07:09:57 +00:00
return ref _existingComponentStore . Get < TComponent > ( entityID ) ;
2019-06-14 03:28:26 +00:00
}
2020-03-22 00:38:35 +00:00
internal bool EntityHasComponentOfType < TComponent > ( int entityID ) where TComponent : struct
2019-06-19 21:14:44 +00:00
{
2020-03-20 07:09:57 +00:00
return _existingComponentStore . Has < TComponent > ( entityID ) ;
2019-07-18 01:12:29 +00:00
}
2019-12-29 21:54:08 +00:00
internal void MarkAllComponentsOnEntityForRemoval ( int entityID )
2019-07-18 01:12:29 +00:00
{
2020-03-20 07:09:57 +00:00
_entitiesMarkedForRemoval . Add ( entityID ) ;
2019-07-18 01:12:29 +00:00
}
internal void RemoveMarkedComponents ( )
{
2020-03-20 07:09:57 +00:00
foreach ( var entityID in _entitiesMarkedForRemoval )
2019-07-18 01:12:29 +00:00
{
2020-03-20 07:09:57 +00:00
_existingComponentStore . Remove ( entityID ) ;
_immediateComponentStore . Remove ( entityID ) ;
_replayStore . Remove ( entityID ) ;
_upToDateComponentStore . Remove ( entityID ) ;
_drawLayerManager . UnRegisterEntityWithLayer ( entityID ) ;
2019-07-18 01:12:29 +00:00
}
2020-03-20 07:09:57 +00:00
_entitiesMarkedForRemoval . Clear ( ) ;
2019-07-18 01:12:29 +00:00
}
2020-03-22 00:38:35 +00:00
public bool RemoveImmediate < TComponent > ( int entityID , int priority ) where TComponent : struct
2019-06-16 01:05:56 +00:00
{
2020-03-20 07:09:57 +00:00
if ( _immediateComponentStore . Remove < TComponent > ( entityID , priority ) )
2019-12-24 02:01:49 +00:00
{
2020-03-20 07:09:57 +00:00
_replayStore . Remove < TComponent > ( entityID , priority ) ;
_upToDateComponentStore . Remove < TComponent > ( entityID , priority ) ;
_drawLayerManager . UnRegisterComponentWithLayer < TComponent > ( entityID ) ;
2019-12-24 02:01:49 +00:00
return true ;
}
return false ;
}
2020-03-22 00:38:35 +00:00
public void Remove < TComponent > ( int entityID , int priority ) where TComponent : struct
2019-12-24 02:01:49 +00:00
{
2020-03-20 07:09:57 +00:00
if ( _upToDateComponentStore . Remove < TComponent > ( entityID , priority ) )
2019-12-24 02:01:49 +00:00
{
2020-03-20 07:09:57 +00:00
_replayStore . Remove < TComponent > ( entityID , priority ) ;
_drawLayerManager . UnRegisterComponentWithLayer < TComponent > ( entityID ) ;
2019-12-24 02:01:49 +00:00
}
2019-06-14 03:28:26 +00:00
}
2020-03-18 00:40:11 +00:00
public bool UpToDateEntityIsEmpty ( int entityID )
{
2020-03-20 07:09:57 +00:00
return _upToDateComponentStore . EntityBitArray ( entityID ) . AllFalse ( ) ;
2020-03-18 00:40:11 +00:00
}
2019-06-14 03:28:26 +00:00
}
}