Update WIP

This commit is contained in:
Mikhail 2023-02-27 18:16:23 +08:00
parent 796a555cbc
commit d64d4407c9
16 changed files with 318 additions and 269 deletions

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: f88c761abb374574fba2ac5aa2d5e41a
guid: 0404e70f4ccc54a41b3da9268ff287ad
MonoImporter:
externalObjects: {}
serializedVersion: 2

View File

@ -19,7 +19,7 @@ namespace DCFApixels.DragonECS
{
return new int[]
{
ComponentType<T0>.uniqueID
ComponentType<T0>.globalID
};
}
}
@ -29,8 +29,8 @@ namespace DCFApixels.DragonECS
{
return new int[]
{
ComponentType<T0>.uniqueID,
ComponentType<T1>.uniqueID
ComponentType<T0>.globalID,
ComponentType<T1>.globalID
};
}
}
@ -40,9 +40,9 @@ namespace DCFApixels.DragonECS
{
return new int[]
{
ComponentType<T0>.uniqueID,
ComponentType<T1>.uniqueID,
ComponentType<T2>.uniqueID
ComponentType<T0>.globalID,
ComponentType<T1>.globalID,
ComponentType<T2>.globalID
};
}
}
@ -52,10 +52,10 @@ namespace DCFApixels.DragonECS
{
return new int[]
{
ComponentType<T0>.uniqueID,
ComponentType<T1>.uniqueID,
ComponentType<T2>.uniqueID,
ComponentType<T3>.uniqueID
ComponentType<T0>.globalID,
ComponentType<T1>.globalID,
ComponentType<T2>.globalID,
ComponentType<T3>.globalID
};
}
}
@ -65,11 +65,11 @@ namespace DCFApixels.DragonECS
{
return new int[]
{
ComponentType<T0>.uniqueID,
ComponentType<T1>.uniqueID,
ComponentType<T2>.uniqueID,
ComponentType<T3>.uniqueID,
ComponentType<T4>.uniqueID
ComponentType<T0>.globalID,
ComponentType<T1>.globalID,
ComponentType<T2>.globalID,
ComponentType<T3>.globalID,
ComponentType<T4>.globalID
};
}
}
@ -79,12 +79,12 @@ namespace DCFApixels.DragonECS
{
return new int[]
{
ComponentType<T0>.uniqueID,
ComponentType<T1>.uniqueID,
ComponentType<T2>.uniqueID,
ComponentType<T3>.uniqueID,
ComponentType<T4>.uniqueID,
ComponentType<T5>.uniqueID
ComponentType<T0>.globalID,
ComponentType<T1>.globalID,
ComponentType<T2>.globalID,
ComponentType<T3>.globalID,
ComponentType<T4>.globalID,
ComponentType<T5>.globalID
};
}
}
@ -94,13 +94,13 @@ namespace DCFApixels.DragonECS
{
return new int[]
{
ComponentType<T0>.uniqueID,
ComponentType<T1>.uniqueID,
ComponentType<T2>.uniqueID,
ComponentType<T3>.uniqueID,
ComponentType<T4>.uniqueID,
ComponentType<T5>.uniqueID,
ComponentType<T6>.uniqueID
ComponentType<T0>.globalID,
ComponentType<T1>.globalID,
ComponentType<T2>.globalID,
ComponentType<T3>.globalID,
ComponentType<T4>.globalID,
ComponentType<T5>.globalID,
ComponentType<T6>.globalID
};
}
}
@ -110,14 +110,14 @@ namespace DCFApixels.DragonECS
{
return new int[]
{
ComponentType<T0>.uniqueID,
ComponentType<T1>.uniqueID,
ComponentType<T2>.uniqueID,
ComponentType<T3>.uniqueID,
ComponentType<T4>.uniqueID,
ComponentType<T5>.uniqueID,
ComponentType<T6>.uniqueID,
ComponentType<T7>.uniqueID
ComponentType<T0>.globalID,
ComponentType<T1>.globalID,
ComponentType<T2>.globalID,
ComponentType<T3>.globalID,
ComponentType<T4>.globalID,
ComponentType<T5>.globalID,
ComponentType<T6>.globalID,
ComponentType<T7>.globalID
};
}
}
@ -127,15 +127,15 @@ namespace DCFApixels.DragonECS
{
return new int[]
{
ComponentType<T0>.uniqueID,
ComponentType<T1>.uniqueID,
ComponentType<T2>.uniqueID,
ComponentType<T3>.uniqueID,
ComponentType<T4>.uniqueID,
ComponentType<T5>.uniqueID,
ComponentType<T6>.uniqueID,
ComponentType<T7>.uniqueID,
ComponentType<T8>.uniqueID
ComponentType<T0>.globalID,
ComponentType<T1>.globalID,
ComponentType<T2>.globalID,
ComponentType<T3>.globalID,
ComponentType<T4>.globalID,
ComponentType<T5>.globalID,
ComponentType<T6>.globalID,
ComponentType<T7>.globalID,
ComponentType<T8>.globalID
};
}
}
@ -145,16 +145,16 @@ namespace DCFApixels.DragonECS
{
return new int[]
{
ComponentType<T0>.uniqueID,
ComponentType<T1>.uniqueID,
ComponentType<T2>.uniqueID,
ComponentType<T3>.uniqueID,
ComponentType<T4>.uniqueID,
ComponentType<T5>.uniqueID,
ComponentType<T6>.uniqueID,
ComponentType<T7>.uniqueID,
ComponentType<T8>.uniqueID,
ComponentType<T9>.uniqueID
ComponentType<T0>.globalID,
ComponentType<T1>.globalID,
ComponentType<T2>.globalID,
ComponentType<T3>.globalID,
ComponentType<T4>.globalID,
ComponentType<T5>.globalID,
ComponentType<T6>.globalID,
ComponentType<T7>.globalID,
ComponentType<T8>.globalID,
ComponentType<T9>.globalID
};
}
}
@ -164,17 +164,17 @@ namespace DCFApixels.DragonECS
{
return new int[]
{
ComponentType<T0>.uniqueID,
ComponentType<T1>.uniqueID,
ComponentType<T2>.uniqueID,
ComponentType<T3>.uniqueID,
ComponentType<T4>.uniqueID,
ComponentType<T5>.uniqueID,
ComponentType<T6>.uniqueID,
ComponentType<T7>.uniqueID,
ComponentType<T8>.uniqueID,
ComponentType<T9>.uniqueID,
ComponentType<T10>.uniqueID
ComponentType<T0>.globalID,
ComponentType<T1>.globalID,
ComponentType<T2>.globalID,
ComponentType<T3>.globalID,
ComponentType<T4>.globalID,
ComponentType<T5>.globalID,
ComponentType<T6>.globalID,
ComponentType<T7>.globalID,
ComponentType<T8>.globalID,
ComponentType<T9>.globalID,
ComponentType<T10>.globalID
};
}
}
@ -184,18 +184,18 @@ namespace DCFApixels.DragonECS
{
return new int[]
{
ComponentType<T0>.uniqueID,
ComponentType<T1>.uniqueID,
ComponentType<T2>.uniqueID,
ComponentType<T3>.uniqueID,
ComponentType<T4>.uniqueID,
ComponentType<T5>.uniqueID,
ComponentType<T6>.uniqueID,
ComponentType<T7>.uniqueID,
ComponentType<T8>.uniqueID,
ComponentType<T9>.uniqueID,
ComponentType<T10>.uniqueID,
ComponentType<T11>.uniqueID
ComponentType<T0>.globalID,
ComponentType<T1>.globalID,
ComponentType<T2>.globalID,
ComponentType<T3>.globalID,
ComponentType<T4>.globalID,
ComponentType<T5>.globalID,
ComponentType<T6>.globalID,
ComponentType<T7>.globalID,
ComponentType<T8>.globalID,
ComponentType<T9>.globalID,
ComponentType<T10>.globalID,
ComponentType<T11>.globalID
};
}
}
@ -210,7 +210,7 @@ namespace DCFApixels.DragonECS
{
return new int[]
{
ComponentType<T0>.uniqueID
ComponentType<T0>.globalID
};
}
}
@ -220,8 +220,8 @@ namespace DCFApixels.DragonECS
{
return new int[]
{
ComponentType<T0>.uniqueID,
ComponentType<T1>.uniqueID
ComponentType<T0>.globalID,
ComponentType<T1>.globalID
};
}
}
@ -231,9 +231,9 @@ namespace DCFApixels.DragonECS
{
return new int[]
{
ComponentType<T0>.uniqueID,
ComponentType<T1>.uniqueID,
ComponentType<T2>.uniqueID
ComponentType<T0>.globalID,
ComponentType<T1>.globalID,
ComponentType<T2>.globalID
};
}
}
@ -243,10 +243,10 @@ namespace DCFApixels.DragonECS
{
return new int[]
{
ComponentType<T0>.uniqueID,
ComponentType<T1>.uniqueID,
ComponentType<T2>.uniqueID,
ComponentType<T3>.uniqueID
ComponentType<T0>.globalID,
ComponentType<T1>.globalID,
ComponentType<T2>.globalID,
ComponentType<T3>.globalID
};
}
}
@ -256,11 +256,11 @@ namespace DCFApixels.DragonECS
{
return new int[]
{
ComponentType<T0>.uniqueID,
ComponentType<T1>.uniqueID,
ComponentType<T2>.uniqueID,
ComponentType<T3>.uniqueID,
ComponentType<T4>.uniqueID
ComponentType<T0>.globalID,
ComponentType<T1>.globalID,
ComponentType<T2>.globalID,
ComponentType<T3>.globalID,
ComponentType<T4>.globalID
};
}
}
@ -270,12 +270,12 @@ namespace DCFApixels.DragonECS
{
return new int[]
{
ComponentType<T0>.uniqueID,
ComponentType<T1>.uniqueID,
ComponentType<T2>.uniqueID,
ComponentType<T3>.uniqueID,
ComponentType<T4>.uniqueID,
ComponentType<T5>.uniqueID
ComponentType<T0>.globalID,
ComponentType<T1>.globalID,
ComponentType<T2>.globalID,
ComponentType<T3>.globalID,
ComponentType<T4>.globalID,
ComponentType<T5>.globalID
};
}
}
@ -285,13 +285,13 @@ namespace DCFApixels.DragonECS
{
return new int[]
{
ComponentType<T0>.uniqueID,
ComponentType<T1>.uniqueID,
ComponentType<T2>.uniqueID,
ComponentType<T3>.uniqueID,
ComponentType<T4>.uniqueID,
ComponentType<T5>.uniqueID,
ComponentType<T6>.uniqueID
ComponentType<T0>.globalID,
ComponentType<T1>.globalID,
ComponentType<T2>.globalID,
ComponentType<T3>.globalID,
ComponentType<T4>.globalID,
ComponentType<T5>.globalID,
ComponentType<T6>.globalID
};
}
}
@ -301,14 +301,14 @@ namespace DCFApixels.DragonECS
{
return new int[]
{
ComponentType<T0>.uniqueID,
ComponentType<T1>.uniqueID,
ComponentType<T2>.uniqueID,
ComponentType<T3>.uniqueID,
ComponentType<T4>.uniqueID,
ComponentType<T5>.uniqueID,
ComponentType<T6>.uniqueID,
ComponentType<T7>.uniqueID
ComponentType<T0>.globalID,
ComponentType<T1>.globalID,
ComponentType<T2>.globalID,
ComponentType<T3>.globalID,
ComponentType<T4>.globalID,
ComponentType<T5>.globalID,
ComponentType<T6>.globalID,
ComponentType<T7>.globalID
};
}
}

View File

@ -13,7 +13,7 @@ namespace DCFApixels.DragonECS
public EcsWorld World { get; }
public int ID { get; }
public bool Has(int index);
public void Add(int index);
public void Write(int index);
public void Del(int index);
}
@ -49,33 +49,34 @@ namespace DCFApixels.DragonECS
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public ref T Write(int index)
{
return ref _denseItems[_sparseSet[index]];
if (_sparseSet.Contains(index))
{
return ref _denseItems[_sparseSet[index]];
}
else
{
_sparseSet.Add(index);
_sparseSet.Normalize(ref _denseItems);
return ref _denseItems[_sparseSet.IndexOf(index)];
}
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public ref T Add(int index)
{
_sparseSet.Add(index);
_sparseSet.Normalize(ref _denseItems);
return ref _denseItems[_sparseSet.IndexOf(index)];
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool Has(int index)
{
return _sparseSet.Contains(index);
return _sparseSet.IndexOf(index) > 0;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void Del(int index)
{
_sparseSet.Remove(index);
_sparseSet.RemoveAt(index);
}
#endregion
#region IEcsFieldPool
void IEcsPool.Add(int index)
void IEcsPool.Write(int index)
{
Add(index);
Write(index);
}
#endregion
@ -87,4 +88,28 @@ namespace DCFApixels.DragonECS
public override int GetHashCode() => _source.GetHashCode() + ID;
#endregion
}
public static partial class EntityExtensions
{
public static ref readonly T Read<T>(this in Entity self)
where T : struct
{
return ref self.world.GetPool<T>().Read(self.id);
}
public static ref T Write<T>(this in Entity self)
where T : struct
{
return ref self.world.GetPool<T>().Write(self.id);
}
public static bool Has<T>(this in Entity self)
where T : struct
{
return self.world.GetPool<T>().Has(self.id);
}
public static void Del<T>(this in Entity self)
where T : struct
{
self.world.GetPool<T>().Del(self.id);
}
}
}

View File

@ -9,6 +9,9 @@ namespace DCFApixels.DragonECS
public class EcsSession
{
private int _id;
private List<IEcsProcessor> _allProcessors;
private ReadOnlyCollection<IEcsProcessor> _allProcessorsSealed;
@ -151,5 +154,9 @@ namespace DCFApixels.DragonECS
// return new ent(target.id, target.world._gens[target.id], -1000);
}
#endregion
}
}

View File

@ -7,6 +7,11 @@ using System.Threading.Tasks;
namespace DCFApixels.DragonECS
{
public class EcsWorldMap
{
}
public class EcsWorld
{
public const int MAX_WORLDS = byte.MaxValue; //Номер последнего мира 254
@ -14,7 +19,7 @@ namespace DCFApixels.DragonECS
private byte _id = DEAD_WORLD_ID;
private float _timeScale;//TODO реализовать собсвенныйтайм склей для разных миров
//private float _timeScale;//TODO реализовать собсвенныйтайм склей для разных миров
private IEcsPool[] _pools;
private SparseSet _componentIDToPoolID;
@ -45,27 +50,11 @@ namespace DCFApixels.DragonECS
}
#endregion
#region Filters
public EcsFilter GetFilter<TMask>(TMask mask) where TMask : Mask
{
if (_maskIDToFilterID.TryAdd(mask.ID, ref _filters))
{
EcsFilter filter = new EcsFilter(this, mask, 512);
_filters[_maskIDToFilterID.IndexOf(mask.ID)] = filter;
return filter;
}
else
{
return _filters[_maskIDToFilterID.IndexOf(mask.ID)];
}
}
#endregion
#region GetPool
#region Pools
public EcsPool<T> GetPool<T>()
where T : struct
{
int uniqueID = ComponentType<T>.uniqueID;
int uniqueID = ComponentType<T>.globalID;
int poolIndex = _componentIDToPoolID.IndexOf(uniqueID);
if (poolIndex >= 0)
{
@ -88,6 +77,22 @@ namespace DCFApixels.DragonECS
}
#endregion
#region Filters
public EcsFilter GetFilter<TMask>(TMask mask) where TMask : Mask
{
if (_maskIDToFilterID.TryAdd(mask.ID, ref _filters))
{
EcsFilter filter = new EcsFilter(this, mask, 512);
_filters[_maskIDToFilterID.IndexOf(mask.ID)] = filter;
return filter;
}
else
{
return _filters[_maskIDToFilterID.IndexOf(mask.ID)];
}
}
#endregion
#region NewEntity
public ent NewEntity()
{

View File

@ -1,33 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
namespace DCFApixels.DragonECS
{
public class EcsWorldMap
{
private EcsWorld[] _worlds = new EcsWorld[8];
private SparseSet _sparceSet = new SparseSet(8);
public EcsWorld this[int index]
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get => _worlds[index];
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void InsertWorld(EcsWorld world)
{
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void RemoveWorld(EcsWorld world)
{
}
}
}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: c53ca292f39cf9d48a0bb60a65fc1232
guid: b4766bca23373eb4cb95ecae89f45c3f
MonoImporter:
externalObjects: {}
serializedVersion: 2

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: f04087406e09f6042a341cf8fc41fabf
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 8e4f5b9d0612fde4997b44362501d498
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -110,11 +110,6 @@ namespace DCFApixels.DragonECS
{
return self == ent.NULL;
}
public static Entity UseIn(in ent self, EcsSession session)
{
session.GetWorld()
}
}
public ref struct Entity

View File

@ -1,17 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DCFApixels.DragonECS
{
internal abstract class ComponentType
{
protected static int _increment = 0;
}
internal sealed class ComponentType<T> : ComponentType
{
internal static int uniqueID = _increment++;
}
}

View File

@ -0,0 +1,98 @@
using System;
using System.Runtime.CompilerServices;
namespace DCFApixels.DragonECS
{
internal abstract class ComponentType
{
internal static int increment = 1;
internal static int capacity = 512;
}
internal sealed class ComponentType<T> : ComponentType
{
internal static int globalID;
static ComponentType()
{
globalID = increment++;
if (increment > capacity)
{
capacity <<= 1;
}
}
}
public class ComponentTypeMap
{
private int[] _dense;
private int[] _sparse;
private int _count;
#region Properties
public int Count
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get => _count;
}
#endregion
#region Constrcutors
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public ComponentTypeMap(int denseCapacity = 64)
{
_dense = new int[denseCapacity];
_sparse = new int[ComponentType.capacity];
_count = 0;
}
#endregion
#region Contains
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool Contains<T>() => Contains(ComponentType<T>.globalID);
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private bool Contains(int globalID)
{
return globalID > 0 && globalID < _sparse.Length && _sparse[globalID] > 0;
}
#endregion
#region GetID
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public int GetID<T>()
{
int globalID = ComponentType<T>.globalID;
if (!Contains(globalID))
{
Add(globalID);
}
return _dense[globalID];
}
#endregion
#region Add
private void Add(int entityID)
{
if (Contains(entityID))
return;
if (++_count >= _dense.Length)
Array.Resize(ref _dense, _dense.Length << 1);
if (entityID > _sparse.Length)
{
int neadedSpace = _sparse.Length;
while (entityID >= neadedSpace)
neadedSpace <<= 1;
Array.Resize(ref _sparse, neadedSpace);
}
_dense[_count] = entityID;
_sparse[entityID] = _count;
}
#endregion
}
}

View File

@ -1,64 +0,0 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DCFApixels.DragonECS
{
public class CompressedBitMask
{
private const int CHUNK = 32; //int bits
private int[] _fullChunkIndexes; // индексы чанков с полным заполнением
private int[] _sparseIndexes;
private int[] _denseMasks;
private int _highBit = 0;
public int HightBit => _highBit;
public void Set(int[] indexes, int count)
{
}
public ref struct EqualsRequest
{
private CompressedBitMask _source;
private CompressedBitMask _other;
public void GetEnumerator() =>
}
public ref struct Enumerator
{
private readonly int[] _indexes;
private readonly int[] _masks;
private int _index;
public Enumerator(int[] indexes, int[] masks)
{
_indexes = indexes;
_masks = masks;
_index = -1;
}
public int Current
{
get => 0;
}
public void Dispose() { }
public bool MoveNext()
{
}
public void Reset()
{
_index = -1;
}
}
}
}

11
test/SharedData.cs.meta Normal file
View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ea74209e58692b3428f531e27d577cd7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: