mirror of
https://github.com/DCFApixels/DragonECS.git
synced 2025-09-18 18:14:37 +08:00
expand functionality. redesign IEcsReadonlyGroup into EcsReadonlyGroup
This commit is contained in:
parent
db3e633a05
commit
f8d03cf949
@ -7,7 +7,7 @@ namespace DCFApixels.DragonECS
|
||||
#region Properties
|
||||
public IEcsWorld World { get; }
|
||||
public EcsMask Mask { get; }
|
||||
public IEcsReadonlyGroup Entities { get; }
|
||||
public EcsReadonlyGroup Entities { get; }
|
||||
public int EntitiesCount { get; }
|
||||
#endregion
|
||||
}
|
||||
@ -29,10 +29,10 @@ namespace DCFApixels.DragonECS
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
get => _mask;
|
||||
}
|
||||
public IEcsReadonlyGroup Entities
|
||||
public EcsReadonlyGroup Entities
|
||||
{
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
get => _entities;
|
||||
get => _entities.Readonly;
|
||||
}
|
||||
public int EntitiesCount
|
||||
{
|
||||
|
@ -1,26 +1,33 @@
|
||||
using System;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
using delayedOp = System.Int32;
|
||||
|
||||
namespace DCFApixels.DragonECS
|
||||
{
|
||||
public interface IEcsReadonlyGroup
|
||||
[StructLayout(LayoutKind.Sequential, Pack = 0, Size = 8)]
|
||||
public readonly ref struct EcsReadonlyGroup
|
||||
{
|
||||
int Count { get; }
|
||||
bool Contains(int entityID);
|
||||
EcsGroup.Enumerator GetEnumerator();
|
||||
}
|
||||
public interface IEcsGroup : IEcsReadonlyGroup
|
||||
{
|
||||
void Add(int entityID);
|
||||
void Remove(int entityID);
|
||||
private readonly EcsGroup _source;
|
||||
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public EcsReadonlyGroup(EcsGroup source) => _source = source;
|
||||
public int Count
|
||||
{
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
get => _source.Count;
|
||||
}
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public bool Contains(int entityID) => _source.Contains(entityID);
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public EcsGroup.Enumerator GetEnumerator() => _source.GetEnumerator();
|
||||
}
|
||||
|
||||
// не может содержать значение 0
|
||||
// _delayedOps это int[] для отложенных операций, хранятся отложенные операции в виде int значения, если старший бит = 0 то это опреация добавленияб если = 1 то это операция вычитания
|
||||
|
||||
// this collection can only store numbers greater than 0
|
||||
public class EcsGroup : IEcsGroup
|
||||
public class EcsGroup
|
||||
{
|
||||
public const int DEALAYED_ADD = 0;
|
||||
public const int DEALAYED_REMOVE = int.MinValue;
|
||||
@ -44,6 +51,11 @@ namespace DCFApixels.DragonECS
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
get => _count;
|
||||
}
|
||||
public EcsReadonlyGroup Readonly
|
||||
{
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
get => new EcsReadonlyGroup(this);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Constrcutors
|
||||
@ -86,7 +98,7 @@ namespace DCFApixels.DragonECS
|
||||
if(++_count >= _dense.Length)
|
||||
Array.Resize(ref _dense, _dense.Length << 1);
|
||||
|
||||
if (entityID > _sparse.Length)
|
||||
if (entityID >= _sparse.Length)
|
||||
{
|
||||
int neadedSpace = _sparse.Length;
|
||||
while (entityID >= neadedSpace)
|
||||
@ -128,20 +140,21 @@ namespace DCFApixels.DragonECS
|
||||
//TODO добавить автосоритровку при каждом GetEnumerator
|
||||
|
||||
#region AddGroup/RemoveGroup
|
||||
public void AddGroup(IEcsReadonlyGroup group)
|
||||
public void AddGroup(EcsReadonlyGroup group)
|
||||
{
|
||||
foreach (var item in group)
|
||||
{
|
||||
Add(item.id);
|
||||
}
|
||||
foreach (var item in group) Add(item.id);
|
||||
}
|
||||
|
||||
public void RemoveGroup(IEcsReadonlyGroup group)
|
||||
public void RemoveGroup(EcsReadonlyGroup group)
|
||||
{
|
||||
foreach (var item in group)
|
||||
{
|
||||
Remove(item.id);
|
||||
}
|
||||
foreach (var item in group) Remove(item.id);
|
||||
}
|
||||
public void AddGroup(EcsGroup group)
|
||||
{
|
||||
foreach (var item in group) Add(item.id);
|
||||
}
|
||||
public void RemoveGroup(EcsGroup group)
|
||||
{
|
||||
foreach (var item in group) Remove(item.id);
|
||||
}
|
||||
#endregion
|
||||
|
||||
@ -179,7 +192,7 @@ namespace DCFApixels.DragonECS
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Utils
|
||||
#region Enumerator
|
||||
public struct Enumerator : IDisposable
|
||||
{
|
||||
private readonly EcsGroup _source;
|
||||
|
@ -6,7 +6,11 @@ namespace DCFApixels.DragonECS
|
||||
{
|
||||
public interface IEcsPool
|
||||
{
|
||||
public int EntitiesCount { get; }
|
||||
public int Capacity { get; }
|
||||
|
||||
public IEcsWorld World { get; }
|
||||
public Type DataType { get; }
|
||||
public int ID { get; }
|
||||
public bool Has(int index);
|
||||
public void Write(int index);
|
||||
@ -30,7 +34,12 @@ namespace DCFApixels.DragonECS
|
||||
}
|
||||
|
||||
public IEcsWorld World => _source;
|
||||
public Type DataType => typeof(void);
|
||||
public int ID => -1;
|
||||
|
||||
public int EntitiesCount => 0;
|
||||
public int Capacity => 1;
|
||||
|
||||
public void Del(int index) { }
|
||||
public bool Has(int index) => false;
|
||||
public void Write(int index) { }
|
||||
@ -47,7 +56,11 @@ namespace DCFApixels.DragonECS
|
||||
private IEcsComponentReset<T> _componentResetHandler;
|
||||
|
||||
#region Properites
|
||||
public int EntitiesCount => _sparseSet.Count;
|
||||
public int Capacity => _sparseSet.CapacityDense;
|
||||
|
||||
public IEcsWorld World => _source;
|
||||
public Type DataType => typeof(T);
|
||||
public int ID => _id;
|
||||
#endregion
|
||||
|
||||
@ -112,6 +125,7 @@ namespace DCFApixels.DragonECS
|
||||
#endregion
|
||||
}
|
||||
|
||||
#region ComponentResetHandler
|
||||
internal static class ComponentResetHandler
|
||||
{
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
@ -137,4 +151,5 @@ namespace DCFApixels.DragonECS
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public void Reset(ref T component) => _fakeInstnace.Reset(ref component);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Runtime.CompilerServices;
|
||||
|
||||
namespace DCFApixels.DragonECS
|
||||
@ -13,6 +14,12 @@ namespace DCFApixels.DragonECS
|
||||
public int ID { get; }
|
||||
#endregion
|
||||
|
||||
|
||||
#region GetterMethods
|
||||
public ReadOnlySpan<IEcsPool> GetAllPools();
|
||||
|
||||
#endregion
|
||||
|
||||
#region Methods
|
||||
public EcsPool<T> GetPool<T>() where T : struct;
|
||||
public EcsFilter Filter<TInc>() where TInc : struct, IInc;
|
||||
@ -68,6 +75,11 @@ namespace DCFApixels.DragonECS
|
||||
|
||||
private EcsFilter[] _filters;
|
||||
|
||||
#region GetterMethods
|
||||
public ReadOnlySpan<IEcsPool> GetAllPools() => new ReadOnlySpan<IEcsPool>(_pools);
|
||||
|
||||
#endregion
|
||||
|
||||
#region Properties
|
||||
public bool IsEmpty => _entities.Count < 0;
|
||||
public Type ArchetypeType => typeof(TArchetype);
|
||||
|
Loading…
Reference in New Issue
Block a user