From e49dca0403c0c5fa00951581e3f9b2b23aec40c9 Mon Sep 17 00:00:00 2001 From: Booklordofthedings Date: Mon, 11 Nov 2024 18:00:37 +0100 Subject: [PATCH 01/17] Initial Commit --- src/ComponentManager.bf | 109 ++++++++++++++++++++++++++++++++ src/ECS.bf | 102 ++++++++++++++++++++++++++++++ src/Example/MoverSystem.bf | 13 ++++ src/Example/Position.bf | 9 +++ src/Example/Program.bf | 62 +++++++++++++++++++ src/Example/Velocity.bf | 9 +++ src/System.bf | 15 +++++ src/SystemMethodAttribute.bf | 117 +++++++++++++++++++++++++++++++++++ 8 files changed, 436 insertions(+) create mode 100644 src/ComponentManager.bf create mode 100644 src/ECS.bf create mode 100644 src/Example/MoverSystem.bf create mode 100644 src/Example/Position.bf create mode 100644 src/Example/Program.bf create mode 100644 src/Example/Velocity.bf create mode 100644 src/System.bf create mode 100644 src/SystemMethodAttribute.bf diff --git a/src/ComponentManager.bf b/src/ComponentManager.bf new file mode 100644 index 0000000..8fe5778 --- /dev/null +++ b/src/ComponentManager.bf @@ -0,0 +1,109 @@ +namespace Theater_ECS; + +using System; +using System.Threading; +using System.Collections; + +class ComponentManager +{ + private Monitor _Lock = new .() ~ delete _; + + private int_cosize _ComponentSize = -1; + private readonly int _IndexSize = sizeof(int_cosize); + + private int_cosize _Next = 0; + private List _Data = null ~ delete _; + private List _Available = new .() ~ delete _; + private HashSet _Deleted = new .() ~ delete _; + + ///Make the component manager useable for a specific type of component + public void Initialize(int_cosize count) where T : struct + { + _ComponentSize = sizeof(T); + _Data = new .( //So that we dont have to realloc as frequently + (_IndexSize + _ComponentSize) * count + ); + } + + ///Creates space for a new component instance and returns a pointer to it + public (Component, void*) Create(Entity owner) + { + if (_Available.Count > 0) + { + var idx = _Available.PopFront(); + _Deleted.Remove(idx); + + *(int_cosize*)(void*)&_Data[idx * (_ComponentSize + _IndexSize)] = owner; + void* toReturn = (void*)&_Data[idx * (_ComponentSize + _IndexSize) + _IndexSize]; + return ( + idx, + toReturn + ); + } + else + { + Grow(); + *(int_cosize*)(void*)(_Data.Ptr + (_Next * (_ComponentSize + _IndexSize))) = owner; + //This calculates to the next biggest position + the offset of the index + void* toReturn = (void*)(_Data.Ptr + (_Next * (_ComponentSize + _IndexSize) + _IndexSize)); + return ( + _Next++, + toReturn + ); + } + } + + ///Remove an entry, and returns a pointer to the removed object, if you want to + public Result Remove(int_cosize idx) + { + if (idx >= _Next || _Deleted.Contains(idx)) + return .Err; + + *(int_cosize*)(void*)&_Data[idx * (_ComponentSize + _IndexSize)] = -1; + + _Deleted.Add(idx); + + return .Ok( + (void*)(_Data.Ptr + idx * (_ComponentSize + _IndexSize) + _IndexSize) + ); + } + + public int_cosize Count + { + get + { + return (.)(_Data.Count / (_ComponentSize + _IndexSize)); + } + } + + + public Span<(Entity, T)> GetAll() where T : struct + { + return .((.)(void*)_Data.Ptr, Count); + } + + [Unchecked] + public T* Get(int_cosize idx) where T : struct + { + return (T*)(void*)(_Data.Ptr + idx * (_ComponentSize + _IndexSize) + _IndexSize); + } + + [Unchecked] + public void GetEntities(List list) + { + var ec = (_Data.Count / (_ComponentSize + _IndexSize)); + list.GrowUninitialized(ec); + for (int i < ec) + *(list.Ptr + (i)) = *(Entity*)(void*)(_Data.Ptr +i * (_ComponentSize + _IndexSize)); + } + + public void Use() => _Lock.Enter(); + public void StopUsing() => _Lock.Exit(); + + + public void Grow(int_cosize amount = 1) + { //Make more size useable + _Data.GrowUninitialized((_ComponentSize + _IndexSize) * amount); + } + +} \ No newline at end of file diff --git a/src/ECS.bf b/src/ECS.bf new file mode 100644 index 0000000..e251196 --- /dev/null +++ b/src/ECS.bf @@ -0,0 +1,102 @@ +namespace Theater_ECS; + +using System; +using System.Collections; + +public typealias Entity = int_cosize; + +public typealias Component = int_cosize; + +class ECS +{ + public int_cosize MaxComponents; + + private int_cosize _ComponentsNext = 0; + private List _ComponentsPacked = new .() ~ DeleteContainerAndItems!(_); + private Dictionary _ComponentMap = new .() ~ delete _; + + private Entity _EntityNext = 0; + private List> _EntityList = new .() ~ DeleteContainerAndItems!(_); + private Queue _EntityAvailable = new .() ~ delete _; + private HashSet _DeletedEntities = new .() ~ delete _; + + public Component RegisterComponent(int_cosize count) where T : struct + { + _ComponentsPacked.Add(new ComponentManager()..Initialize(count)); + _EntityList.Add(new .(MaxComponents)); + _ComponentMap.Add(typeof(T), _ComponentsNext); + return _ComponentsNext++; + } + + public Component GetComponent() + { + if(_ComponentMap.ContainsKey(typeof(T))) + return _ComponentMap[typeof(T)]; + return -1; + } + + public Entity CreateEntity() + { + if(_EntityAvailable.Count > 0) + { + var e = _EntityAvailable.PopFront(); + _DeletedEntities.Remove(e); + return e; + } + else + { + for(var i in _EntityList) + i.Add(-1); + return _EntityNext++; + } + } + + public void RemoveEntity(Entity e) + { + if(e >= _EntityNext || _DeletedEntities.Contains(e)) + return; + + _DeletedEntities.Add(e); + _EntityAvailable.Add(e); + + for(int i < _EntityList.Count) + { + if(_EntityList[i][e] != -1) + { + _ComponentsPacked[i].Remove(_EntityList[i][e]); + _EntityList[i][e] = -1; + } + } + } + + public Result AddComponentToEntity(Entity e, Component c) + { + if(e >= _EntityNext || _DeletedEntities.Contains(e)) + return .Err; + + var res = _ComponentsPacked[c].Create(e); + _EntityList[c][e] = res.0; + return res.1; + } + + public Result RemoveComponentFromEntity(Entity e, Component c) + { + if(e >= _EntityNext || _DeletedEntities.Contains(e)) + return .Err; + + return _ComponentsPacked[c].Remove(e); + } + + public void GetEntityFromComponent(Component c, List e) + { + _ComponentsPacked[c].[Unchecked]GetEntities(e); + } + + public void ExecuteSystem(delegate void(ECS, Entity, ref A) func) where A : struct + { + var idx = GetComponent(); + var data = _ComponentsPacked[idx].GetAll(); + for(var i in ref data) + func.Invoke(this, i.0, ref i.1); + } +} \ No newline at end of file diff --git a/src/Example/MoverSystem.bf b/src/Example/MoverSystem.bf new file mode 100644 index 0000000..e02cec7 --- /dev/null +++ b/src/Example/MoverSystem.bf @@ -0,0 +1,13 @@ +namespace Theater_ECS.Example; + + +class MoverSystem : System +{ + + [SystemMethod("MoveItems", typeof(Velocity), typeof(Position))] + public void MoveItems(ref Velocity v,ref Position p) + { + //p.x = v.x + p.x; + //p.y = v.y = p.y; + } +} \ No newline at end of file diff --git a/src/Example/Position.bf b/src/Example/Position.bf new file mode 100644 index 0000000..1157b34 --- /dev/null +++ b/src/Example/Position.bf @@ -0,0 +1,9 @@ +namespace Theater_ECS.Example; + +using System; + +struct Position +{ + public float x = (.)gRand.NextI32() % 25; + public float y = (.)gRand.NextI32() % 25; +} \ No newline at end of file diff --git a/src/Example/Program.bf b/src/Example/Program.bf new file mode 100644 index 0000000..1c78700 --- /dev/null +++ b/src/Example/Program.bf @@ -0,0 +1,62 @@ +namespace Theater_ECS; +using Theater_ECS.Example; + + +using System; +using System.Collections; + +class Program +{ + public static uint64 counter = 0; + + public static void Main() + { + ECS ecs = scope .(); + var pos = ecs.RegisterComponent(100); + //var waste = ecs.RegisterComponent(100); + var vel = ecs.RegisterComponent(100); + + + List entities = scope .(); + for(int i < 500000) + entities.Add(ecs.CreateEntity()); + + for(var i in entities) + *(Position*)ecs.AddComponentToEntity(i, pos).Value = .(); + + for(var i in entities) + *(Velocity*)ecs.AddComponentToEntity(i, vel).Value = .(); + + /* + for(var i in entities) + if(gRand.NextI32() % 2 == 1) + *(waste*)ecs.AddComponentToEntity(i, waste).Value = .(); + */ + + MoverSystem s = scope .(); + s.IntializeSystem(ecs); + + System.Diagnostics.Stopwatch watch = scope .(); + for(int a < 10) + { + watch.Start(); + for(int i < 10) + { + + s.RunSystem(ecs); + + } + Console.WriteLine(scope $"{watch.ElapsedMilliseconds}ms"); + watch.Stop(); + watch.Reset(); + } + //Console.Read(); + } + + +} + +public struct waste +{ + private float[10] a; +} \ No newline at end of file diff --git a/src/Example/Velocity.bf b/src/Example/Velocity.bf new file mode 100644 index 0000000..8067be8 --- /dev/null +++ b/src/Example/Velocity.bf @@ -0,0 +1,9 @@ +namespace Theater_ECS.Example; + +using System; + +struct Velocity +{ + public float x = (.)gRand.NextI32() % 25; + public float y = (.)gRand.NextI32() % 25; +} \ No newline at end of file diff --git a/src/System.bf b/src/System.bf new file mode 100644 index 0000000..a84ca56 --- /dev/null +++ b/src/System.bf @@ -0,0 +1,15 @@ +namespace Theater_ECS; + +using System; +using System.Collections; + +abstract class System +{ + protected Dictionary _ComponentMap = new .() ~ delete _; + protected List _Target = new .(100) ~ delete _; + + public abstract void RunSystem(ECS ecs); + + public abstract bool IntializeSystem(ECS ecs); + +} \ No newline at end of file diff --git a/src/SystemMethodAttribute.bf b/src/SystemMethodAttribute.bf new file mode 100644 index 0000000..1541cea --- /dev/null +++ b/src/SystemMethodAttribute.bf @@ -0,0 +1,117 @@ +namespace Theater_ECS; + +using System; +using System.Reflection; +using System.Collections; + +[AttributeUsage(.Method)] +struct SystemMethodAttribute : Attribute, IOnTypeInit +{ + private StringView _Name; + private Span _Types; + + public this(StringView name, params Span types) + { + _Name = name; + _Types = types; + } + + [Comptime] + public void OnTypeInit(Type type, Self* prev) + { + //InitializeFunction + Compiler.EmitTypeBody(type, scope $""" + public override bool IntializeSystem(ECS ecs) + \{ + {InitializeSystemTypes( .. scope .())} + return true; + \} + + """); + + + Compiler.EmitTypeBody(type, scope $""" + [System.DisableChecks] + public override void RunSystem(ECS ecs) + \{ + Lock(ecs); + + Component lowest = System.int_cosize.MaxValue; + System.int_cosize lowestAmount = System.int_cosize.MaxValue; + for(var c in _ComponentMap) + \{ + if(ecs.[System.Friend]_ComponentsPacked[c.value].Count < lowestAmount) + \{ + lowest = c.value; + lowestAmount = ecs.[System.Friend]_ComponentsPacked[c.value].Count; + \} + \} + + + ecs.GetEntityFromComponent(lowest, _Target); + + {CacheComponentData(.. scope .())} + + + for(var e in _Target) + \{ + + {_Name}( + {GetComponentData(.. scope .())} + ); + \} + + _Target.Clear(); + + Unlock(ecs); + + \} + + private void Lock(ECS ecs) + \{ + for(var i in _ComponentMap) + ecs.[System.Friend]_ComponentsPacked[i.value].Use(); + \} + + private void Unlock(ECS ecs) + \{ + for(var i in _ComponentMap) + ecs.[System.Friend]_ComponentsPacked[i.value].StopUsing(); + \} + """); + } + + private void InitializeSystemTypes(String buffer) + { + for(var i in _Types) + { + buffer.Append(scope $""" + if(ecs.GetComponent<{i.GetName( .. scope .())}>() == -1) + return false; + _ComponentMap.Add(typeof({i.GetName(.. scope .())}), ecs.GetComponent<{i.GetName( .. scope .())}>()); + + + """); + } + } + + private void GetComponentData(String buffer) + { + for(var i in _Types) + { + buffer.Append(scope $""" + ref *ecs.[System.Friend]_ComponentsPacked[_{i.GetName(.. scope .())}].Get<{i.GetName(.. scope .())}>(ecs.[System.Friend]_EntityList[_{i.GetName(.. scope .())}][e]) + """); + if(@i.Index+1 < _Types.Length) + buffer.Append(",\n"); + } + } + + private void CacheComponentData(String buffer) + { + for(var i in _Types) + { + buffer.Append(scope $"Component _{i.GetName(.. scope .())} = _ComponentMap[typeof({i.GetName(.. scope .())})];\n"); + } + } +} \ No newline at end of file From 171b36d571327361e2929aed4930e62b89713e28 Mon Sep 17 00:00:00 2001 From: Booklordofthedings Date: Mon, 11 Nov 2024 19:47:09 +0100 Subject: [PATCH 02/17] Initial Commit (#2) Move to this branch for ecs changes Reviewed-on: https://code.booklordofthe.dev/Theater/Theater-ECS/pulls/2 --- src/ComponentManager.bf | 109 ++++++++++++++++++++++++++++++++ src/ECS.bf | 102 ++++++++++++++++++++++++++++++ src/Example/MoverSystem.bf | 13 ++++ src/Example/Position.bf | 9 +++ src/Example/Program.bf | 62 +++++++++++++++++++ src/Example/Velocity.bf | 9 +++ src/System.bf | 15 +++++ src/SystemMethodAttribute.bf | 117 +++++++++++++++++++++++++++++++++++ 8 files changed, 436 insertions(+) create mode 100644 src/ComponentManager.bf create mode 100644 src/ECS.bf create mode 100644 src/Example/MoverSystem.bf create mode 100644 src/Example/Position.bf create mode 100644 src/Example/Program.bf create mode 100644 src/Example/Velocity.bf create mode 100644 src/System.bf create mode 100644 src/SystemMethodAttribute.bf diff --git a/src/ComponentManager.bf b/src/ComponentManager.bf new file mode 100644 index 0000000..8fe5778 --- /dev/null +++ b/src/ComponentManager.bf @@ -0,0 +1,109 @@ +namespace Theater_ECS; + +using System; +using System.Threading; +using System.Collections; + +class ComponentManager +{ + private Monitor _Lock = new .() ~ delete _; + + private int_cosize _ComponentSize = -1; + private readonly int _IndexSize = sizeof(int_cosize); + + private int_cosize _Next = 0; + private List _Data = null ~ delete _; + private List _Available = new .() ~ delete _; + private HashSet _Deleted = new .() ~ delete _; + + ///Make the component manager useable for a specific type of component + public void Initialize(int_cosize count) where T : struct + { + _ComponentSize = sizeof(T); + _Data = new .( //So that we dont have to realloc as frequently + (_IndexSize + _ComponentSize) * count + ); + } + + ///Creates space for a new component instance and returns a pointer to it + public (Component, void*) Create(Entity owner) + { + if (_Available.Count > 0) + { + var idx = _Available.PopFront(); + _Deleted.Remove(idx); + + *(int_cosize*)(void*)&_Data[idx * (_ComponentSize + _IndexSize)] = owner; + void* toReturn = (void*)&_Data[idx * (_ComponentSize + _IndexSize) + _IndexSize]; + return ( + idx, + toReturn + ); + } + else + { + Grow(); + *(int_cosize*)(void*)(_Data.Ptr + (_Next * (_ComponentSize + _IndexSize))) = owner; + //This calculates to the next biggest position + the offset of the index + void* toReturn = (void*)(_Data.Ptr + (_Next * (_ComponentSize + _IndexSize) + _IndexSize)); + return ( + _Next++, + toReturn + ); + } + } + + ///Remove an entry, and returns a pointer to the removed object, if you want to + public Result Remove(int_cosize idx) + { + if (idx >= _Next || _Deleted.Contains(idx)) + return .Err; + + *(int_cosize*)(void*)&_Data[idx * (_ComponentSize + _IndexSize)] = -1; + + _Deleted.Add(idx); + + return .Ok( + (void*)(_Data.Ptr + idx * (_ComponentSize + _IndexSize) + _IndexSize) + ); + } + + public int_cosize Count + { + get + { + return (.)(_Data.Count / (_ComponentSize + _IndexSize)); + } + } + + + public Span<(Entity, T)> GetAll() where T : struct + { + return .((.)(void*)_Data.Ptr, Count); + } + + [Unchecked] + public T* Get(int_cosize idx) where T : struct + { + return (T*)(void*)(_Data.Ptr + idx * (_ComponentSize + _IndexSize) + _IndexSize); + } + + [Unchecked] + public void GetEntities(List list) + { + var ec = (_Data.Count / (_ComponentSize + _IndexSize)); + list.GrowUninitialized(ec); + for (int i < ec) + *(list.Ptr + (i)) = *(Entity*)(void*)(_Data.Ptr +i * (_ComponentSize + _IndexSize)); + } + + public void Use() => _Lock.Enter(); + public void StopUsing() => _Lock.Exit(); + + + public void Grow(int_cosize amount = 1) + { //Make more size useable + _Data.GrowUninitialized((_ComponentSize + _IndexSize) * amount); + } + +} \ No newline at end of file diff --git a/src/ECS.bf b/src/ECS.bf new file mode 100644 index 0000000..e251196 --- /dev/null +++ b/src/ECS.bf @@ -0,0 +1,102 @@ +namespace Theater_ECS; + +using System; +using System.Collections; + +public typealias Entity = int_cosize; + +public typealias Component = int_cosize; + +class ECS +{ + public int_cosize MaxComponents; + + private int_cosize _ComponentsNext = 0; + private List _ComponentsPacked = new .() ~ DeleteContainerAndItems!(_); + private Dictionary _ComponentMap = new .() ~ delete _; + + private Entity _EntityNext = 0; + private List> _EntityList = new .() ~ DeleteContainerAndItems!(_); + private Queue _EntityAvailable = new .() ~ delete _; + private HashSet _DeletedEntities = new .() ~ delete _; + + public Component RegisterComponent(int_cosize count) where T : struct + { + _ComponentsPacked.Add(new ComponentManager()..Initialize(count)); + _EntityList.Add(new .(MaxComponents)); + _ComponentMap.Add(typeof(T), _ComponentsNext); + return _ComponentsNext++; + } + + public Component GetComponent() + { + if(_ComponentMap.ContainsKey(typeof(T))) + return _ComponentMap[typeof(T)]; + return -1; + } + + public Entity CreateEntity() + { + if(_EntityAvailable.Count > 0) + { + var e = _EntityAvailable.PopFront(); + _DeletedEntities.Remove(e); + return e; + } + else + { + for(var i in _EntityList) + i.Add(-1); + return _EntityNext++; + } + } + + public void RemoveEntity(Entity e) + { + if(e >= _EntityNext || _DeletedEntities.Contains(e)) + return; + + _DeletedEntities.Add(e); + _EntityAvailable.Add(e); + + for(int i < _EntityList.Count) + { + if(_EntityList[i][e] != -1) + { + _ComponentsPacked[i].Remove(_EntityList[i][e]); + _EntityList[i][e] = -1; + } + } + } + + public Result AddComponentToEntity(Entity e, Component c) + { + if(e >= _EntityNext || _DeletedEntities.Contains(e)) + return .Err; + + var res = _ComponentsPacked[c].Create(e); + _EntityList[c][e] = res.0; + return res.1; + } + + public Result RemoveComponentFromEntity(Entity e, Component c) + { + if(e >= _EntityNext || _DeletedEntities.Contains(e)) + return .Err; + + return _ComponentsPacked[c].Remove(e); + } + + public void GetEntityFromComponent(Component c, List e) + { + _ComponentsPacked[c].[Unchecked]GetEntities(e); + } + + public void ExecuteSystem(delegate void(ECS, Entity, ref A) func) where A : struct + { + var idx = GetComponent(); + var data = _ComponentsPacked[idx].GetAll(); + for(var i in ref data) + func.Invoke(this, i.0, ref i.1); + } +} \ No newline at end of file diff --git a/src/Example/MoverSystem.bf b/src/Example/MoverSystem.bf new file mode 100644 index 0000000..e02cec7 --- /dev/null +++ b/src/Example/MoverSystem.bf @@ -0,0 +1,13 @@ +namespace Theater_ECS.Example; + + +class MoverSystem : System +{ + + [SystemMethod("MoveItems", typeof(Velocity), typeof(Position))] + public void MoveItems(ref Velocity v,ref Position p) + { + //p.x = v.x + p.x; + //p.y = v.y = p.y; + } +} \ No newline at end of file diff --git a/src/Example/Position.bf b/src/Example/Position.bf new file mode 100644 index 0000000..1157b34 --- /dev/null +++ b/src/Example/Position.bf @@ -0,0 +1,9 @@ +namespace Theater_ECS.Example; + +using System; + +struct Position +{ + public float x = (.)gRand.NextI32() % 25; + public float y = (.)gRand.NextI32() % 25; +} \ No newline at end of file diff --git a/src/Example/Program.bf b/src/Example/Program.bf new file mode 100644 index 0000000..1c78700 --- /dev/null +++ b/src/Example/Program.bf @@ -0,0 +1,62 @@ +namespace Theater_ECS; +using Theater_ECS.Example; + + +using System; +using System.Collections; + +class Program +{ + public static uint64 counter = 0; + + public static void Main() + { + ECS ecs = scope .(); + var pos = ecs.RegisterComponent(100); + //var waste = ecs.RegisterComponent(100); + var vel = ecs.RegisterComponent(100); + + + List entities = scope .(); + for(int i < 500000) + entities.Add(ecs.CreateEntity()); + + for(var i in entities) + *(Position*)ecs.AddComponentToEntity(i, pos).Value = .(); + + for(var i in entities) + *(Velocity*)ecs.AddComponentToEntity(i, vel).Value = .(); + + /* + for(var i in entities) + if(gRand.NextI32() % 2 == 1) + *(waste*)ecs.AddComponentToEntity(i, waste).Value = .(); + */ + + MoverSystem s = scope .(); + s.IntializeSystem(ecs); + + System.Diagnostics.Stopwatch watch = scope .(); + for(int a < 10) + { + watch.Start(); + for(int i < 10) + { + + s.RunSystem(ecs); + + } + Console.WriteLine(scope $"{watch.ElapsedMilliseconds}ms"); + watch.Stop(); + watch.Reset(); + } + //Console.Read(); + } + + +} + +public struct waste +{ + private float[10] a; +} \ No newline at end of file diff --git a/src/Example/Velocity.bf b/src/Example/Velocity.bf new file mode 100644 index 0000000..8067be8 --- /dev/null +++ b/src/Example/Velocity.bf @@ -0,0 +1,9 @@ +namespace Theater_ECS.Example; + +using System; + +struct Velocity +{ + public float x = (.)gRand.NextI32() % 25; + public float y = (.)gRand.NextI32() % 25; +} \ No newline at end of file diff --git a/src/System.bf b/src/System.bf new file mode 100644 index 0000000..a84ca56 --- /dev/null +++ b/src/System.bf @@ -0,0 +1,15 @@ +namespace Theater_ECS; + +using System; +using System.Collections; + +abstract class System +{ + protected Dictionary _ComponentMap = new .() ~ delete _; + protected List _Target = new .(100) ~ delete _; + + public abstract void RunSystem(ECS ecs); + + public abstract bool IntializeSystem(ECS ecs); + +} \ No newline at end of file diff --git a/src/SystemMethodAttribute.bf b/src/SystemMethodAttribute.bf new file mode 100644 index 0000000..1541cea --- /dev/null +++ b/src/SystemMethodAttribute.bf @@ -0,0 +1,117 @@ +namespace Theater_ECS; + +using System; +using System.Reflection; +using System.Collections; + +[AttributeUsage(.Method)] +struct SystemMethodAttribute : Attribute, IOnTypeInit +{ + private StringView _Name; + private Span _Types; + + public this(StringView name, params Span types) + { + _Name = name; + _Types = types; + } + + [Comptime] + public void OnTypeInit(Type type, Self* prev) + { + //InitializeFunction + Compiler.EmitTypeBody(type, scope $""" + public override bool IntializeSystem(ECS ecs) + \{ + {InitializeSystemTypes( .. scope .())} + return true; + \} + + """); + + + Compiler.EmitTypeBody(type, scope $""" + [System.DisableChecks] + public override void RunSystem(ECS ecs) + \{ + Lock(ecs); + + Component lowest = System.int_cosize.MaxValue; + System.int_cosize lowestAmount = System.int_cosize.MaxValue; + for(var c in _ComponentMap) + \{ + if(ecs.[System.Friend]_ComponentsPacked[c.value].Count < lowestAmount) + \{ + lowest = c.value; + lowestAmount = ecs.[System.Friend]_ComponentsPacked[c.value].Count; + \} + \} + + + ecs.GetEntityFromComponent(lowest, _Target); + + {CacheComponentData(.. scope .())} + + + for(var e in _Target) + \{ + + {_Name}( + {GetComponentData(.. scope .())} + ); + \} + + _Target.Clear(); + + Unlock(ecs); + + \} + + private void Lock(ECS ecs) + \{ + for(var i in _ComponentMap) + ecs.[System.Friend]_ComponentsPacked[i.value].Use(); + \} + + private void Unlock(ECS ecs) + \{ + for(var i in _ComponentMap) + ecs.[System.Friend]_ComponentsPacked[i.value].StopUsing(); + \} + """); + } + + private void InitializeSystemTypes(String buffer) + { + for(var i in _Types) + { + buffer.Append(scope $""" + if(ecs.GetComponent<{i.GetName( .. scope .())}>() == -1) + return false; + _ComponentMap.Add(typeof({i.GetName(.. scope .())}), ecs.GetComponent<{i.GetName( .. scope .())}>()); + + + """); + } + } + + private void GetComponentData(String buffer) + { + for(var i in _Types) + { + buffer.Append(scope $""" + ref *ecs.[System.Friend]_ComponentsPacked[_{i.GetName(.. scope .())}].Get<{i.GetName(.. scope .())}>(ecs.[System.Friend]_EntityList[_{i.GetName(.. scope .())}][e]) + """); + if(@i.Index+1 < _Types.Length) + buffer.Append(",\n"); + } + } + + private void CacheComponentData(String buffer) + { + for(var i in _Types) + { + buffer.Append(scope $"Component _{i.GetName(.. scope .())} = _ComponentMap[typeof({i.GetName(.. scope .())})];\n"); + } + } +} \ No newline at end of file From 239ddd1b186f08380b3f45283b1112203c818ca7 Mon Sep 17 00:00:00 2001 From: Booklordofthedings Date: Tue, 12 Nov 2024 13:19:00 +0100 Subject: [PATCH 03/17] initial setup for entt --- src/ComponentManager.bf | 4 +- src/ECS.bf | 22 +++++------ src/EntityRegister.bf | 71 ++++++++++++++++++++++++++++++++++++ src/Example/Program.bf | 27 ++++++++++++-- src/PagedSparseSet.bf | 5 +++ src/SystemMethodAttribute.bf | 2 +- 6 files changed, 114 insertions(+), 17 deletions(-) create mode 100644 src/EntityRegister.bf create mode 100644 src/PagedSparseSet.bf diff --git a/src/ComponentManager.bf b/src/ComponentManager.bf index 8fe5778..85ed544 100644 --- a/src/ComponentManager.bf +++ b/src/ComponentManager.bf @@ -33,7 +33,7 @@ class ComponentManager var idx = _Available.PopFront(); _Deleted.Remove(idx); - *(int_cosize*)(void*)&_Data[idx * (_ComponentSize + _IndexSize)] = owner; + *(int_cosize*)(void*)&_Data[idx * (_ComponentSize + _IndexSize)] = (.)owner; void* toReturn = (void*)&_Data[idx * (_ComponentSize + _IndexSize) + _IndexSize]; return ( idx, @@ -43,7 +43,7 @@ class ComponentManager else { Grow(); - *(int_cosize*)(void*)(_Data.Ptr + (_Next * (_ComponentSize + _IndexSize))) = owner; + *(int_cosize*)(void*)(_Data.Ptr + (_Next * (_ComponentSize + _IndexSize))) = (.)owner; //This calculates to the next biggest position + the offset of the index void* toReturn = (void*)(_Data.Ptr + (_Next * (_ComponentSize + _IndexSize) + _IndexSize)); return ( diff --git a/src/ECS.bf b/src/ECS.bf index e251196..db84df7 100644 --- a/src/ECS.bf +++ b/src/ECS.bf @@ -3,7 +3,7 @@ namespace Theater_ECS; using System; using System.Collections; -public typealias Entity = int_cosize; +//public typealias Entity = int_cosize; public typealias Component = int_cosize; @@ -15,7 +15,7 @@ class ECS private List _ComponentsPacked = new .() ~ DeleteContainerAndItems!(_); private Dictionary _ComponentMap = new .() ~ delete _; - private Entity _EntityNext = 0; + private int_cosize _EntityNext = 0; private List> _EntityList = new .() ~ DeleteContainerAndItems!(_); private Queue _EntityAvailable = new .() ~ delete _; private HashSet _DeletedEntities = new .() ~ delete _; @@ -47,13 +47,13 @@ class ECS { for(var i in _EntityList) i.Add(-1); - return _EntityNext++; + return (.)_EntityNext++; } } public void RemoveEntity(Entity e) { - if(e >= _EntityNext || _DeletedEntities.Contains(e)) + if(e >= (.)_EntityNext || _DeletedEntities.Contains(e)) return; _DeletedEntities.Add(e); @@ -61,30 +61,30 @@ class ECS for(int i < _EntityList.Count) { - if(_EntityList[i][e] != -1) + if(_EntityList[i][(.)e] != -1) { - _ComponentsPacked[i].Remove(_EntityList[i][e]); - _EntityList[i][e] = -1; + _ComponentsPacked[i].Remove(_EntityList[i][(.)e]); + _EntityList[i][(.)e] = -1; } } } public Result AddComponentToEntity(Entity e, Component c) { - if(e >= _EntityNext || _DeletedEntities.Contains(e)) + if(e >= (.)_EntityNext || _DeletedEntities.Contains(e)) return .Err; var res = _ComponentsPacked[c].Create(e); - _EntityList[c][e] = res.0; + _EntityList[c][(.)e] = res.0; return res.1; } public Result RemoveComponentFromEntity(Entity e, Component c) { - if(e >= _EntityNext || _DeletedEntities.Contains(e)) + if(e >= (.)_EntityNext || _DeletedEntities.Contains(e)) return .Err; - return _ComponentsPacked[c].Remove(e); + return _ComponentsPacked[c].Remove((.)e); } public void GetEntityFromComponent(Component c, List e) diff --git a/src/EntityRegister.bf b/src/EntityRegister.bf new file mode 100644 index 0000000..1fc686a --- /dev/null +++ b/src/EntityRegister.bf @@ -0,0 +1,71 @@ +namespace Theater_ECS; + +using System; +using System.Collections; + +static +{ + + public struct Entity : uint32 + { + public static readonly Entity Null => 0xFFFFF; + public static readonly uint32 VersionMask => 0xFFF00000; + public static readonly uint32 IndexMask => 0x000FFFFF; + public static readonly uint8 VersionOffset => 20; + + public uint32 Index => (.)this & IndexMask; + public uint32 Version => (.)(this & VersionMask) >> VersionOffset + public Entity Next => .(Index, Version + 1); + + public this() {}; + + public this(uint32 index, uint32 version) + { + this = (index & IndexMask) | ((version << VersionOffset) & VersionMask); + + } + + public override void ToString(String strBuffer) + { + strBuffer.Append(scope $"{Index}:{Version}"); + } + } +} + +class EntityRegister +{ + private List _entities = new .() ~ delete _; + private int32 _available = 0; + private Entity _next = .Null; + + + public Entity CreateEntity() + { + if(_available == 0) + { + if(_entities.Count + 1 > Entity.IndexMask) + return .Null; //It would be beneficial if we could avoid this check + return .((.)_entities..Add(.((.)_entities.Count, 0)).Count, 0); + } + else + { + _available--; + + let temp = _next.Index; + _next = (.)_entities[_next.Index].Index; + _entities[temp] = (.)(temp | (_entities[temp].Version << Entity.VersionOffset)); + + return _entities[temp]; + } + } + + public void RemoveEntity(Entity e) + { + let temp = _next; + _next = .(e.Index, 255); + _entities[e.Index] = .(temp.Index, _entities[e.Index].Version+1); + _available++; + } + + public bool IsAlive(Entity e) => e == _entities[e.Index]; +} \ No newline at end of file diff --git a/src/Example/Program.bf b/src/Example/Program.bf index 1c78700..c20d2a4 100644 --- a/src/Example/Program.bf +++ b/src/Example/Program.bf @@ -11,6 +11,29 @@ class Program public static void Main() { + /* + Entity e = Entity(45454, 797979790); + Console.WriteLine(e); + Console.Read(); + + EntityRegister r = scope .(); + while(true) + { + Console.WriteLine(scope $"Next: {r.[Friend]_next}"); + for(var i in r.[Friend]_entities) + Console.WriteLine(i); + var l = Console.ReadLine(.. scope .()); + + Console.Clear(); + + if(l == "c") + Console.WriteLine(r.CreateEntity()); + else if(l == "d") + r.RemoveEntity(.((.)gRand.Next(0 , r.[Friend]_entities.Count), 0)); + Console.WriteLine(); + } + */ + ECS ecs = scope .(); var pos = ecs.RegisterComponent(100); //var waste = ecs.RegisterComponent(100); @@ -50,10 +73,8 @@ class Program watch.Stop(); watch.Reset(); } - //Console.Read(); + Console.Read(); } - - } public struct waste diff --git a/src/PagedSparseSet.bf b/src/PagedSparseSet.bf new file mode 100644 index 0000000..55a004e --- /dev/null +++ b/src/PagedSparseSet.bf @@ -0,0 +1,5 @@ +namespace Theater_ECS; + +class PagedSparseSet +{ +} \ No newline at end of file diff --git a/src/SystemMethodAttribute.bf b/src/SystemMethodAttribute.bf index 1541cea..0b1e1c5 100644 --- a/src/SystemMethodAttribute.bf +++ b/src/SystemMethodAttribute.bf @@ -100,7 +100,7 @@ struct SystemMethodAttribute : Attribute, IOnTypeInit for(var i in _Types) { buffer.Append(scope $""" - ref *ecs.[System.Friend]_ComponentsPacked[_{i.GetName(.. scope .())}].Get<{i.GetName(.. scope .())}>(ecs.[System.Friend]_EntityList[_{i.GetName(.. scope .())}][e]) + ref *ecs.[System.Friend]_ComponentsPacked[_{i.GetName(.. scope .())}].Get<{i.GetName(.. scope .())}>(ecs.[System.Friend]_EntityList[_{i.GetName(.. scope .())}][(.)e]) """); if(@i.Index+1 < _Types.Length) buffer.Append(",\n"); From 9bf9452cbeb63aaf47d522afa3d6c8039ae25dc1 Mon Sep 17 00:00:00 2001 From: Booklordofthedings Date: Tue, 12 Nov 2024 18:07:00 +0100 Subject: [PATCH 04/17] Rewrite Implement the sparse set and entity registry that entt uses/describes --- src/Entity.bf | 31 +++++++++++++ src/EntityRegister.bf | 33 +------------- src/Example/MoverSystem.bf | 4 +- src/Example/Program.bf | 90 +++++++++++++------------------------- src/PagedSparseSet.bf | 74 ++++++++++++++++++++++++++++++- src/World.bf | 12 +++++ 6 files changed, 150 insertions(+), 94 deletions(-) create mode 100644 src/Entity.bf create mode 100644 src/World.bf diff --git a/src/Entity.bf b/src/Entity.bf new file mode 100644 index 0000000..0a0da92 --- /dev/null +++ b/src/Entity.bf @@ -0,0 +1,31 @@ +namespace Theater_ECS; + +using System; + +public struct Entity : uint32 +{ + public static readonly Entity Null => 0x000FFFFF; + public static readonly uint32 VersionMask => 0xFFF00000; + public static readonly uint32 IndexMask => 0x000FFFFF; + public static readonly uint8 VersionOffset => 20; + + public uint32 Index => (.)this & IndexMask; + public uint32 Version => (.)(this & VersionMask) >> VersionOffset + public Entity Next => .(Index, Version + 1); + + public this() + { + this = Entity.Null; + }; + + public this(uint32 index, uint32 version) + { + this = (index & IndexMask) | ((version << VersionOffset) & VersionMask); + + } + + public override void ToString(String strBuffer) + { + strBuffer.Append(scope $"{Index}:{Version}"); + } +} \ No newline at end of file diff --git a/src/EntityRegister.bf b/src/EntityRegister.bf index 1fc686a..dde6f29 100644 --- a/src/EntityRegister.bf +++ b/src/EntityRegister.bf @@ -3,35 +3,6 @@ namespace Theater_ECS; using System; using System.Collections; -static -{ - - public struct Entity : uint32 - { - public static readonly Entity Null => 0xFFFFF; - public static readonly uint32 VersionMask => 0xFFF00000; - public static readonly uint32 IndexMask => 0x000FFFFF; - public static readonly uint8 VersionOffset => 20; - - public uint32 Index => (.)this & IndexMask; - public uint32 Version => (.)(this & VersionMask) >> VersionOffset - public Entity Next => .(Index, Version + 1); - - public this() {}; - - public this(uint32 index, uint32 version) - { - this = (index & IndexMask) | ((version << VersionOffset) & VersionMask); - - } - - public override void ToString(String strBuffer) - { - strBuffer.Append(scope $"{Index}:{Version}"); - } - } -} - class EntityRegister { private List _entities = new .() ~ delete _; @@ -39,7 +10,7 @@ class EntityRegister private Entity _next = .Null; - public Entity CreateEntity() + public Entity Create() { if(_available == 0) { @@ -59,7 +30,7 @@ class EntityRegister } } - public void RemoveEntity(Entity e) + public void Remove(Entity e) { let temp = _next; _next = .(e.Index, 255); diff --git a/src/Example/MoverSystem.bf b/src/Example/MoverSystem.bf index e02cec7..7777556 100644 --- a/src/Example/MoverSystem.bf +++ b/src/Example/MoverSystem.bf @@ -7,7 +7,7 @@ class MoverSystem : System [SystemMethod("MoveItems", typeof(Velocity), typeof(Position))] public void MoveItems(ref Velocity v,ref Position p) { - //p.x = v.x + p.x; - //p.y = v.y = p.y; + p.x = v.x + p.x; + p.y = v.y = p.y; } } \ No newline at end of file diff --git a/src/Example/Program.bf b/src/Example/Program.bf index c20d2a4..6cd5acb 100644 --- a/src/Example/Program.bf +++ b/src/Example/Program.bf @@ -11,68 +11,38 @@ class Program public static void Main() { - /* - Entity e = Entity(45454, 797979790); - Console.WriteLine(e); - Console.Read(); - - EntityRegister r = scope .(); - while(true) - { - Console.WriteLine(scope $"Next: {r.[Friend]_next}"); - for(var i in r.[Friend]_entities) - Console.WriteLine(i); - var l = Console.ReadLine(.. scope .()); - - Console.Clear(); - - if(l == "c") - Console.WriteLine(r.CreateEntity()); - else if(l == "d") - r.RemoveEntity(.((.)gRand.Next(0 , r.[Friend]_entities.Count), 0)); - Console.WriteLine(); - } - */ - - ECS ecs = scope .(); - var pos = ecs.RegisterComponent(100); - //var waste = ecs.RegisterComponent(100); - var vel = ecs.RegisterComponent(100); - - - List entities = scope .(); - for(int i < 500000) - entities.Add(ecs.CreateEntity()); - - for(var i in entities) - *(Position*)ecs.AddComponentToEntity(i, pos).Value = .(); - - for(var i in entities) - *(Velocity*)ecs.AddComponentToEntity(i, vel).Value = .(); - - /* - for(var i in entities) - if(gRand.NextI32() % 2 == 1) - *(waste*)ecs.AddComponentToEntity(i, waste).Value = .(); - */ - - MoverSystem s = scope .(); - s.IntializeSystem(ecs); - - System.Diagnostics.Stopwatch watch = scope .(); - for(int a < 10) - { - watch.Start(); - for(int i < 10) + EntityRegister e = scope .(); + PagedSparseSet p = scope .(); + PagedSparseSet v =scope .(); + List es = new .(); + defer delete es; + for(int i < 1000000) { - - s.RunSystem(ecs); - + var ent = e.Create(); + p.Add(ent, .()); + v.Add(ent, .()); + es.Add(ent); + } + + System.Diagnostics.Stopwatch watch = scope .(); + for(int a < 10) + { + watch.Start(); + for(int i < 10) + { + var pos = p.GetAll(); + var vel = v.GetAll(); + + for(var ps in pos) + { + ps.1.x += vel[@ps.Index].1.x; + ps.1.y += vel[@ps.Index].1.y; + } + } + Console.WriteLine(scope $"{watch.ElapsedMilliseconds}ms"); + watch.Stop(); + watch.Reset(); } - Console.WriteLine(scope $"{watch.ElapsedMilliseconds}ms"); - watch.Stop(); - watch.Reset(); - } Console.Read(); } } diff --git a/src/PagedSparseSet.bf b/src/PagedSparseSet.bf index 55a004e..d4e04b7 100644 --- a/src/PagedSparseSet.bf +++ b/src/PagedSparseSet.bf @@ -1,5 +1,77 @@ namespace Theater_ECS; -class PagedSparseSet +using System; +using System.Collections; + +class PagedSparseSet where T : struct { + public const uint32 PageSize = 4096; + + private List> _sparse = new .()~ DeleteContainerAndItems!(_); + private List<(Entity, T)> _packed = new .() ~ delete _; + private List _packedEntities = new .() ~ delete _; + + public (Entity, T) this[Entity e] + { + public get => _packed[_sparse[e.Index/PageSize][e.Index % PageSize].Index]; + } + + public bool Contains(Entity e) + { + return _sparse[e.Index/PageSize][e.Index % PageSize] != Entity.Null; + } + + public void Add(Entity e, T toAdd) + { + EnsureLoadedPage(e.Index/PageSize); + _packed.Add((e, toAdd)); + _sparse[e.Index/PageSize][e.Index % PageSize] = (.)_packed.Count-1; + } + + public void Remove(Entity e) + { + EnsurePage(e.Index/PageSize); + if(_sparse[e.Index/PageSize] == null) + return; + + let toRm = _packed[_sparse[e.Index/PageSize][e.Index % PageSize].Index]; + let b = _packed.Back; + _packed[_sparse[e.Index/PageSize][e.Index % PageSize].Index] = b; + _packed.Back = toRm; + + _sparse[b.0.Index/PageSize][b.0.Index % PageSize] = Entity(e.Index, b.0.Version); + _sparse[e.Index/PageSize][e.Index % PageSize] = Entity.Null; + + _packed.PopBack(); + } + + public T* Get(Entity e) + { + return &_packed[_sparse[e.Index/PageSize][e.Index % PageSize].Index].1; + } + + public Span<(Entity, T)> GetAll() + { + return _packed; + } + + ///Ensure that a page exist and is loaded + public void EnsureLoadedPage(uint32 page) + { + EnsurePage(page); + if(_sparse[page] == null) + { + _sparse[page] = new List(PageSize); + _sparse[page].[Friend]Count = 4096; + _sparse[page].SetAll(Entity.Null); + + } + } + + ///Ensure that a page exists, it might be null though + private void EnsurePage(uint32 page) + { + while(_sparse.Count < page+1) + _sparse.Add(null); + } } \ No newline at end of file diff --git a/src/World.bf b/src/World.bf new file mode 100644 index 0000000..098b05c --- /dev/null +++ b/src/World.bf @@ -0,0 +1,12 @@ +namespace Theater_ECS; + +using System; +using System.Collections; + +class World +{ + EntityRegister Registry = new .() ~ delete _; + + private Dictionary _components = new .() ~ delete _; + private List _componentStorage = new .() ~ DeleteContainerAndDisposeItems!(_); +} \ No newline at end of file From 55077fc7c39fe2554bb9f7303f46878dafcdc1a7 Mon Sep 17 00:00:00 2001 From: Booklordofthedings Date: Thu, 14 Nov 2024 15:35:33 +0100 Subject: [PATCH 05/17] More Dynamic system --- src/ComponentManager.bf | 109 ----------------- src/ComponentRegistry.bf | 52 ++++++++ src/{ => Containers}/PagedSparseSet.bf | 28 +++-- src/Containers/UList.bf | 162 +++++++++++++++++++++++++ src/ECS.bf | 104 +++------------- src/Entity.bf | 2 +- src/EntityRegister.bf | 2 + src/Example/MoverSystem.bf | 13 -- src/Example/Position.bf | 6 + src/Example/Program.bf | 110 +++++++++++------ src/System.bf | 89 +++++++++++++- src/SystemMethodAttribute.bf | 117 ------------------ src/World.bf | 12 -- 13 files changed, 420 insertions(+), 386 deletions(-) delete mode 100644 src/ComponentManager.bf create mode 100644 src/ComponentRegistry.bf rename src/{ => Containers}/PagedSparseSet.bf (68%) create mode 100644 src/Containers/UList.bf delete mode 100644 src/Example/MoverSystem.bf delete mode 100644 src/SystemMethodAttribute.bf delete mode 100644 src/World.bf diff --git a/src/ComponentManager.bf b/src/ComponentManager.bf deleted file mode 100644 index 85ed544..0000000 --- a/src/ComponentManager.bf +++ /dev/null @@ -1,109 +0,0 @@ -namespace Theater_ECS; - -using System; -using System.Threading; -using System.Collections; - -class ComponentManager -{ - private Monitor _Lock = new .() ~ delete _; - - private int_cosize _ComponentSize = -1; - private readonly int _IndexSize = sizeof(int_cosize); - - private int_cosize _Next = 0; - private List _Data = null ~ delete _; - private List _Available = new .() ~ delete _; - private HashSet _Deleted = new .() ~ delete _; - - ///Make the component manager useable for a specific type of component - public void Initialize(int_cosize count) where T : struct - { - _ComponentSize = sizeof(T); - _Data = new .( //So that we dont have to realloc as frequently - (_IndexSize + _ComponentSize) * count - ); - } - - ///Creates space for a new component instance and returns a pointer to it - public (Component, void*) Create(Entity owner) - { - if (_Available.Count > 0) - { - var idx = _Available.PopFront(); - _Deleted.Remove(idx); - - *(int_cosize*)(void*)&_Data[idx * (_ComponentSize + _IndexSize)] = (.)owner; - void* toReturn = (void*)&_Data[idx * (_ComponentSize + _IndexSize) + _IndexSize]; - return ( - idx, - toReturn - ); - } - else - { - Grow(); - *(int_cosize*)(void*)(_Data.Ptr + (_Next * (_ComponentSize + _IndexSize))) = (.)owner; - //This calculates to the next biggest position + the offset of the index - void* toReturn = (void*)(_Data.Ptr + (_Next * (_ComponentSize + _IndexSize) + _IndexSize)); - return ( - _Next++, - toReturn - ); - } - } - - ///Remove an entry, and returns a pointer to the removed object, if you want to - public Result Remove(int_cosize idx) - { - if (idx >= _Next || _Deleted.Contains(idx)) - return .Err; - - *(int_cosize*)(void*)&_Data[idx * (_ComponentSize + _IndexSize)] = -1; - - _Deleted.Add(idx); - - return .Ok( - (void*)(_Data.Ptr + idx * (_ComponentSize + _IndexSize) + _IndexSize) - ); - } - - public int_cosize Count - { - get - { - return (.)(_Data.Count / (_ComponentSize + _IndexSize)); - } - } - - - public Span<(Entity, T)> GetAll() where T : struct - { - return .((.)(void*)_Data.Ptr, Count); - } - - [Unchecked] - public T* Get(int_cosize idx) where T : struct - { - return (T*)(void*)(_Data.Ptr + idx * (_ComponentSize + _IndexSize) + _IndexSize); - } - - [Unchecked] - public void GetEntities(List list) - { - var ec = (_Data.Count / (_ComponentSize + _IndexSize)); - list.GrowUninitialized(ec); - for (int i < ec) - *(list.Ptr + (i)) = *(Entity*)(void*)(_Data.Ptr +i * (_ComponentSize + _IndexSize)); - } - - public void Use() => _Lock.Enter(); - public void StopUsing() => _Lock.Exit(); - - - public void Grow(int_cosize amount = 1) - { //Make more size useable - _Data.GrowUninitialized((_ComponentSize + _IndexSize) * amount); - } - -} \ No newline at end of file diff --git a/src/ComponentRegistry.bf b/src/ComponentRegistry.bf new file mode 100644 index 0000000..befbb27 --- /dev/null +++ b/src/ComponentRegistry.bf @@ -0,0 +1,52 @@ +namespace Theater_ECS; +using Theater_ECS.Containers; + +using System; +using System.Collections; + +typealias Component = int_cosize; + +class ComponentRegistry +{ + + private Dictionary _componentLookup = new .() ~ DeleteDictionaryAndKeys!(_); + public List Components = new .() ~ DeleteContainerAndItems!(_); + + + ///Registers a component based on a name and a size of that component + public Result RegisterComponent(StringView name, int_cosize size) + { + ///Return the existing component if it matches + if(_componentLookup.ContainsKeyAlt(name) + && Components[_componentLookup[scope .(name)]].[Friend]_packedEntities.[Friend]_size == size) + return _componentLookup[scope .(name)]; + else if(_componentLookup.ContainsKeyAlt(name)) + { + return .Err; //There already is a component of the same name but with a different size + } + + //Attempt to find a nulled out entry + //This could be made faster but thats unlikely to ever matter + for(var i in ref Components) + if(i == null) + { + i = new .(size); + _componentLookup.Add(new .(name), (.)@i.Index); + return (Component)@i.Index; + } + + //Make a new one and return it + Components.Add(new .(size)); + _componentLookup.Add(new .(name), (.)(Components.Count-1)); + return (.)(Components.Count-1); + } + + ///Retrieves the id of a component + public Result GetComponent(StringView name) + { + if(!_componentLookup.ContainsKeyAlt(name)) + return .Err; + return _componentLookup[scope .(name)]; + } + +} \ No newline at end of file diff --git a/src/PagedSparseSet.bf b/src/Containers/PagedSparseSet.bf similarity index 68% rename from src/PagedSparseSet.bf rename to src/Containers/PagedSparseSet.bf index d4e04b7..568d6de 100644 --- a/src/PagedSparseSet.bf +++ b/src/Containers/PagedSparseSet.bf @@ -1,19 +1,19 @@ -namespace Theater_ECS; +namespace Theater_ECS.Containers; using System; using System.Collections; -class PagedSparseSet where T : struct +class PagedSparseSet { public const uint32 PageSize = 4096; private List> _sparse = new .()~ DeleteContainerAndItems!(_); - private List<(Entity, T)> _packed = new .() ~ delete _; - private List _packedEntities = new .() ~ delete _; + private List _packed = new .() ~ delete _; + private UList _packedEntities ~ delete _; - public (Entity, T) this[Entity e] + public this(int_cosize size) { - public get => _packed[_sparse[e.Index/PageSize][e.Index % PageSize].Index]; + _packedEntities = new .(size); } public bool Contains(Entity e) @@ -21,10 +21,11 @@ class PagedSparseSet where T : struct return _sparse[e.Index/PageSize][e.Index % PageSize] != Entity.Null; } - public void Add(Entity e, T toAdd) + public void Add(Entity e, void* toAdd) { EnsureLoadedPage(e.Index/PageSize); - _packed.Add((e, toAdd)); + _packed.Add(e); + _packedEntities.Add(toAdd); _sparse[e.Index/PageSize][e.Index % PageSize] = (.)_packed.Count-1; } @@ -39,22 +40,25 @@ class PagedSparseSet where T : struct _packed[_sparse[e.Index/PageSize][e.Index % PageSize].Index] = b; _packed.Back = toRm; - _sparse[b.0.Index/PageSize][b.0.Index % PageSize] = Entity(e.Index, b.0.Version); + _sparse[b.Index/PageSize][b.Index % PageSize] = Entity(e.Index, b.Version); _sparse[e.Index/PageSize][e.Index % PageSize] = Entity.Null; _packed.PopBack(); } - public T* Get(Entity e) + [Inline] + public void* Get(Entity e) { - return &_packed[_sparse[e.Index/PageSize][e.Index % PageSize].Index].1; + return _packedEntities[(.)(_sparse[e.Index/PageSize][e.Index % PageSize].Index)]; } - public Span<(Entity, T)> GetAll() + public Span GetAll() { return _packed; } + public int_cosize Count() => (.)_packed.Count; + ///Ensure that a page exist and is loaded public void EnsureLoadedPage(uint32 page) { diff --git a/src/Containers/UList.bf b/src/Containers/UList.bf new file mode 100644 index 0000000..d4f9713 --- /dev/null +++ b/src/Containers/UList.bf @@ -0,0 +1,162 @@ +namespace Theater_ECS.Containers; + +using System; +using System.Collections; +using System.Diagnostics; +using System.Diagnostics.Contracts; +using System.Threading; +using System.Reflection; + +//A variant of list, which has no type associated with it +class UList +{ + private const int_cosize _defaultCapacity = 4; + private const int_cosize _max = int_cosize.MaxValue; + + private void* _items; //The raw data contained by this object + private readonly int_cosize _sizeof; //The size of a single object + private int_cosize _size; //How much data is actually used + private int_cosize _alloc; //How much data is actually allocated + + /// Adds an item to the back of the list. + public void Add(T* toAdd) + { + if (_size == _alloc) + Realloc(_alloc * 2); + Internal.MemCpy(&((uint8*)_items)[_size], toAdd, sizeof(T)); + _size += _sizeof; + } + + /// Adds an item to the back of the list. + public void Add(void* toAdd) + { + if (_size == _alloc) + Realloc(_alloc * 2); + Internal.MemCpy(&((uint8*)_items)[_size], toAdd, _sizeof); + _size += _sizeof; + } + + public int_cosize Capacity + { + [Inline] + get => (_alloc / _sizeof); + set + { + if (value != _alloc / _sizeof) + Realloc(value * _sizeof); + } + } + + public int_cosize Count + { + [Inline] + get => (_size / _sizeof); + } + + public void* this[int_cosize index] + { + [Checked] + get + { + Runtime.Assert(index < (_size/_sizeof)); + return GetItem(_items, index * _sizeof); + } + + [Unchecked, Inline] + get + { + return GetItem(_items, index* _sizeof); + } + + [Checked] + set + { + Runtime.Assert(index < (_size/_sizeof)); + MemCpy(GetItem(_items, index * _sizeof), value, _sizeof); + } + + [Unchecked, Inline] + set + { + MemCpy(GetItem(_items, index * _sizeof), value, _sizeof); + } + } + + + private void* GetItem(void* i, int32 index) => (uint8*)i + index; + + private void MemCpy(void* dest, void* src, int lenght) => Internal.MemCpy(dest, src, lenght); + +#region Initializers + public this(int_cosize size) + { + _sizeof = size; + Realloc(size * _defaultCapacity); + _alloc = size * _defaultCapacity; + } + + + + public this(int_cosize size, int_cosize capacity) + { + _sizeof = size; + Debug.Assert((uint)capacity <= (uint)_max); + Realloc(size * capacity); + _alloc = size * capacity; + } + + + public ~this() + { + var items = _items; + +#if BF_ENABLE_REALTIME_LEAK_CHECK + // To avoid scanning items being deleted + _items = null; + Interlocked.Fence(); +#endif + + Free(items); + } + +#endregion + +#region MemoryAllocation + private void Realloc(int_cosize newSize) + { + void* oldAlloc = null; + if (newSize > 0) + { + void* newItems = Alloc(newSize); + + if (_size > 0) + Internal.MemCpy(newItems, _items, _size); + oldAlloc = _items; + _items = (.)newItems; + _alloc = newSize; + } + else + { + oldAlloc = _items; + _items = null; + _alloc = 0; + } + + Free(oldAlloc); + return; + } + + private void* Alloc(int_cosize size) + { + return Internal.AllocRawArrayUnmarked(size); + } + + private void Free(void* val) + { + delete val; + } +#endregion +} +/* + +*/ \ No newline at end of file diff --git a/src/ECS.bf b/src/ECS.bf index db84df7..c4a4dff 100644 --- a/src/ECS.bf +++ b/src/ECS.bf @@ -1,102 +1,38 @@ namespace Theater_ECS; +using Theater_ECS.Containers; using System; using System.Collections; -//public typealias Entity = int_cosize; - -public typealias Component = int_cosize; - class ECS { - public int_cosize MaxComponents; + private EntityRegister _registry = new .() ~ delete _; - private int_cosize _ComponentsNext = 0; - private List _ComponentsPacked = new .() ~ DeleteContainerAndItems!(_); - private Dictionary _ComponentMap = new .() ~ delete _; + ///Create a new Entity + public Entity Entity_Create() => _registry.Create(); - private int_cosize _EntityNext = 0; - private List> _EntityList = new .() ~ DeleteContainerAndItems!(_); - private Queue _EntityAvailable = new .() ~ delete _; - private HashSet _DeletedEntities = new .() ~ delete _; + ///Delete an Entity + public void Entity_Delete(Entity e) => _registry.Remove(e); - public Component RegisterComponent(int_cosize count) where T : struct - { - _ComponentsPacked.Add(new ComponentManager()..Initialize(count)); - _EntityList.Add(new .(MaxComponents)); - _ComponentMap.Add(typeof(T), _ComponentsNext); - return _ComponentsNext++; - } + ///Returns wether the given entity is still alive + public bool Entity_Alive(Entity e) => _registry.IsAlive(e); - public Component GetComponent() - { - if(_ComponentMap.ContainsKey(typeof(T))) - return _ComponentMap[typeof(T)]; - return -1; - } + //TODO: Entity_GetAllComponents - public Entity CreateEntity() - { - if(_EntityAvailable.Count > 0) - { - var e = _EntityAvailable.PopFront(); - _DeletedEntities.Remove(e); - return e; - } - else - { - for(var i in _EntityList) - i.Add(-1); - return (.)_EntityNext++; - } - } + + private ComponentRegistry _compRegistry = new .() ~ delete _; - public void RemoveEntity(Entity e) - { - if(e >= (.)_EntityNext || _DeletedEntities.Contains(e)) - return; + ///Registers a component but hides some of the work behind generics + public Component RegisterComponent() => _compRegistry.RegisterComponent(typeof(T).GetFullName(.. scope .()), sizeof(T)); + public Component RegisterComponent(StringView name, int_cosize size) => _compRegistry.RegisterComponent(name, size); - _DeletedEntities.Add(e); - _EntityAvailable.Add(e); + ///Retrieves the id of a component + public Result GetComponent() => _compRegistry.GetComponent(typeof(T).GetFullName(.. scope .())); + public Result GetComponent(StringView name) => _compRegistry.GetComponent(name); - for(int i < _EntityList.Count) - { - if(_EntityList[i][(.)e] != -1) - { - _ComponentsPacked[i].Remove(_EntityList[i][(.)e]); - _EntityList[i][(.)e] = -1; - } - } - } + public int_cosize GetComponentCount(Component c) => _compRegistry.Components[c].Count(); - public Result AddComponentToEntity(Entity e, Component c) - { - if(e >= (.)_EntityNext || _DeletedEntities.Contains(e)) - return .Err; + public Span GetComponentEntities(Component c) => _compRegistry.Components[c].GetAll(); - var res = _ComponentsPacked[c].Create(e); - _EntityList[c][(.)e] = res.0; - return res.1; - } - - public Result RemoveComponentFromEntity(Entity e, Component c) - { - if(e >= (.)_EntityNext || _DeletedEntities.Contains(e)) - return .Err; - - return _ComponentsPacked[c].Remove((.)e); - } - - public void GetEntityFromComponent(Component c, List e) - { - _ComponentsPacked[c].[Unchecked]GetEntities(e); - } - - public void ExecuteSystem(delegate void(ECS, Entity, ref A) func) where A : struct - { - var idx = GetComponent(); - var data = _ComponentsPacked[idx].GetAll(); - for(var i in ref data) - func.Invoke(this, i.0, ref i.1); - } + [Inline] public void* GetComponentData(Entity e, Component c) => _compRegistry.Components[c].Get(e); } \ No newline at end of file diff --git a/src/Entity.bf b/src/Entity.bf index 0a0da92..98f4de1 100644 --- a/src/Entity.bf +++ b/src/Entity.bf @@ -5,7 +5,7 @@ using System; public struct Entity : uint32 { public static readonly Entity Null => 0x000FFFFF; - public static readonly uint32 VersionMask => 0xFFF00000; + public static readonly Entity VersionMask => (.)0xFFF00000; public static readonly uint32 IndexMask => 0x000FFFFF; public static readonly uint8 VersionOffset => 20; diff --git a/src/EntityRegister.bf b/src/EntityRegister.bf index dde6f29..66a2d6d 100644 --- a/src/EntityRegister.bf +++ b/src/EntityRegister.bf @@ -14,8 +14,10 @@ class EntityRegister { if(_available == 0) { +#if DEBUG if(_entities.Count + 1 > Entity.IndexMask) return .Null; //It would be beneficial if we could avoid this check +#endif return .((.)_entities..Add(.((.)_entities.Count, 0)).Count, 0); } else diff --git a/src/Example/MoverSystem.bf b/src/Example/MoverSystem.bf deleted file mode 100644 index 7777556..0000000 --- a/src/Example/MoverSystem.bf +++ /dev/null @@ -1,13 +0,0 @@ -namespace Theater_ECS.Example; - - -class MoverSystem : System -{ - - [SystemMethod("MoveItems", typeof(Velocity), typeof(Position))] - public void MoveItems(ref Velocity v,ref Position p) - { - p.x = v.x + p.x; - p.y = v.y = p.y; - } -} \ No newline at end of file diff --git a/src/Example/Position.bf b/src/Example/Position.bf index 1157b34..c2a2de0 100644 --- a/src/Example/Position.bf +++ b/src/Example/Position.bf @@ -6,4 +6,10 @@ struct Position { public float x = (.)gRand.NextI32() % 25; public float y = (.)gRand.NextI32() % 25; + + public void Update(float a, float b) mut + { + x += a; + y += b; + } } \ No newline at end of file diff --git a/src/Example/Program.bf b/src/Example/Program.bf index 6cd5acb..7878c9c 100644 --- a/src/Example/Program.bf +++ b/src/Example/Program.bf @@ -1,5 +1,6 @@ namespace Theater_ECS; using Theater_ECS.Example; +using Theater_ECS.Containers; using System; @@ -7,47 +8,88 @@ using System.Collections; class Program { - public static uint64 counter = 0; - public static void Main() { - EntityRegister e = scope .(); - PagedSparseSet p = scope .(); - PagedSparseSet v =scope .(); - List es = new .(); - defer delete es; - for(int i < 1000000) - { - var ent = e.Create(); - p.Add(ent, .()); - v.Add(ent, .()); - es.Add(ent); - } + ECS e = scope .(); + MovementSystem s = scope .(); + s.RegisterSystem(e); - System.Diagnostics.Stopwatch watch = scope .(); - for(int a < 10) - { - watch.Start(); - for(int i < 10) - { - var pos = p.GetAll(); - var vel = v.GetAll(); + + for(int32 i < 500000) + { + var entity = e.Entity_Create(); + e.[Friend]_compRegistry.Components[s.[Friend]_Components[0]].Add(entity, &Position()); + e.[Friend]_compRegistry.Components[s.[Friend]_Components[1]].Add(entity, &Velocity()); + /*if((gRand.NextI32() % 3) == 1) + e.[Friend]_compRegistry.Components[s.[Friend]_Components[2]].Add(entity, &waste());*/ + } - for(var ps in pos) - { - ps.1.x += vel[@ps.Index].1.x; - ps.1.y += vel[@ps.Index].1.y; - } - } - Console.WriteLine(scope $"{watch.ElapsedMilliseconds}ms"); - watch.Stop(); - watch.Reset(); + + System.Diagnostics.Stopwatch watch = scope .(); + for(int o < 10) + { + watch.Start(); + for(int ii < 400) + { + + s.RunSystem(e); + } + Console.WriteLine(scope $"{watch.ElapsedMilliseconds}ms"); + watch.Stop(); + watch.Reset(); + } Console.Read(); } + } -public struct waste +struct waste { - private float[10] a; -} \ No newline at end of file + uint32[4] asd; +} +/* + A definition of the functionality and usage of the Theater-ECS + + Goals: + - Fast + The target is handling the maximum alive at one point amount ~1 048 000 components in a single frame + - Use what you need + Allocations should be kept at a minimum (Paging), and components and systems should not be tracked unless they + are used and the user explicitly asks for them + - Dynamic + The ecs should by default be fully dynamic, meaning supporting abitrary systems and components. + Also Types should not be hardlocked to a single component, so that one type can be used for multiple + components. + + Components: + - ECS + -CreateEntity + Create a new entity and return it + -DeleteEntity + Delete the input identity + -IsAlive + Check wether a given identity is alive + -GetAllData + Return Span(ComponentId, void*) containing every component that has data on this entity + + -RegisterComponent + Create a new container and return the id of the component + -GetComponentId + Returns the component id of a given input + -AddComponentToEntity + creates a component data for the entry and returns a pointer to it + -RemoveComponentFromEntity + Deataches a component from an entity + -GetComponentData + Returns a Span for a given component + + -RegisterSystem + Add a system the the ecs object + -RunSystem + Run a single run of a system without registering it + -RunSystems + Run all available systems + -GetSystemEnumerator + Retrieve an IEnumerable for a given set of component IDS +*/ \ No newline at end of file diff --git a/src/System.bf b/src/System.bf index a84ca56..ce2f55a 100644 --- a/src/System.bf +++ b/src/System.bf @@ -1,15 +1,96 @@ namespace Theater_ECS; +using Theater_ECS.Containers; +using Theater_ECS.Example; using System; using System.Collections; abstract class System { - protected Dictionary _ComponentMap = new .() ~ delete _; - protected List _Target = new .(100) ~ delete _; + private List _Components = new .(10) ~ delete _; - public abstract void RunSystem(ECS ecs); + ///Get the compoent id and cache it inside of this system + public void RegisterComponent(ECS ecs) where T : struct => _Components.Add(ecs.RegisterComponent()); - public abstract bool IntializeSystem(ECS ecs); + public abstract void RegisterSystem(ECS ecs); + public virtual void Run(void* p1) { }; + public virtual void Run(void* p1, void* p2) { }; + public virtual void Run(void* p1, void* p2, void* p3) { }; + + + + public void RunSystem(ECS ecs) + { + int_cosize count = int_cosize.MaxValue; + Component comp = _Components[0]; + + for(var c in _Components) + if(ecs.GetComponentCount(c) < count) + { + count = ecs.GetComponentCount(c); + comp = c; + } + + //We now have the list of entities to loop through + Span entities = ecs.GetComponentEntities(comp); + UList main = ecs.[Friend]_compRegistry.Components[comp].[Friend]_packedEntities; + + switch(_Components.Count) + { + case 1: + case 2: + if(comp == _Components[0]) + { + var cun = entities.Length-1; + for(int ii < cun) + { + this.Run( + main[(.)entities[ii].Index], + ecs.GetComponentData(entities[ii], _Components[1])); + } + } + else + { + + } + + + case 3: + var cun = entities.Length-1; + for(int ii < cun) + { + this.Run( + ecs.GetComponentData(entities[ii], _Components[0]), + ecs.GetComponentData(entities[ii], _Components[1]), + ecs.GetComponentData(entities[ii], _Components[2])); + } + } + + + } +} + +class MovementSystem : System +{ + public override void RegisterSystem(ECS ecs) + { + RegisterComponent(ecs); + //RegisterComponent(ecs); + RegisterComponent(ecs); + } + + public override void Run(void* pos, void* vel) + { + ((Position*)pos).x += ((Velocity*)vel).x; + ((Position*)pos).y += ((Velocity*)vel).y; + + } + + public override void Run(void* pos, void* waste, void* vel) + { + ((Position*)pos).x += ((Velocity*)vel).x; + ((Position*)pos).y += ((Velocity*)vel).y; + + } } \ No newline at end of file diff --git a/src/SystemMethodAttribute.bf b/src/SystemMethodAttribute.bf deleted file mode 100644 index 0b1e1c5..0000000 --- a/src/SystemMethodAttribute.bf +++ /dev/null @@ -1,117 +0,0 @@ -namespace Theater_ECS; - -using System; -using System.Reflection; -using System.Collections; - -[AttributeUsage(.Method)] -struct SystemMethodAttribute : Attribute, IOnTypeInit -{ - private StringView _Name; - private Span _Types; - - public this(StringView name, params Span types) - { - _Name = name; - _Types = types; - } - - [Comptime] - public void OnTypeInit(Type type, Self* prev) - { - //InitializeFunction - Compiler.EmitTypeBody(type, scope $""" - public override bool IntializeSystem(ECS ecs) - \{ - {InitializeSystemTypes( .. scope .())} - return true; - \} - - """); - - - Compiler.EmitTypeBody(type, scope $""" - [System.DisableChecks] - public override void RunSystem(ECS ecs) - \{ - Lock(ecs); - - Component lowest = System.int_cosize.MaxValue; - System.int_cosize lowestAmount = System.int_cosize.MaxValue; - for(var c in _ComponentMap) - \{ - if(ecs.[System.Friend]_ComponentsPacked[c.value].Count < lowestAmount) - \{ - lowest = c.value; - lowestAmount = ecs.[System.Friend]_ComponentsPacked[c.value].Count; - \} - \} - - - ecs.GetEntityFromComponent(lowest, _Target); - - {CacheComponentData(.. scope .())} - - - for(var e in _Target) - \{ - - {_Name}( - {GetComponentData(.. scope .())} - ); - \} - - _Target.Clear(); - - Unlock(ecs); - - \} - - private void Lock(ECS ecs) - \{ - for(var i in _ComponentMap) - ecs.[System.Friend]_ComponentsPacked[i.value].Use(); - \} - - private void Unlock(ECS ecs) - \{ - for(var i in _ComponentMap) - ecs.[System.Friend]_ComponentsPacked[i.value].StopUsing(); - \} - """); - } - - private void InitializeSystemTypes(String buffer) - { - for(var i in _Types) - { - buffer.Append(scope $""" - if(ecs.GetComponent<{i.GetName( .. scope .())}>() == -1) - return false; - _ComponentMap.Add(typeof({i.GetName(.. scope .())}), ecs.GetComponent<{i.GetName( .. scope .())}>()); - - - """); - } - } - - private void GetComponentData(String buffer) - { - for(var i in _Types) - { - buffer.Append(scope $""" - ref *ecs.[System.Friend]_ComponentsPacked[_{i.GetName(.. scope .())}].Get<{i.GetName(.. scope .())}>(ecs.[System.Friend]_EntityList[_{i.GetName(.. scope .())}][(.)e]) - """); - if(@i.Index+1 < _Types.Length) - buffer.Append(",\n"); - } - } - - private void CacheComponentData(String buffer) - { - for(var i in _Types) - { - buffer.Append(scope $"Component _{i.GetName(.. scope .())} = _ComponentMap[typeof({i.GetName(.. scope .())})];\n"); - } - } -} \ No newline at end of file diff --git a/src/World.bf b/src/World.bf deleted file mode 100644 index 098b05c..0000000 --- a/src/World.bf +++ /dev/null @@ -1,12 +0,0 @@ -namespace Theater_ECS; - -using System; -using System.Collections; - -class World -{ - EntityRegister Registry = new .() ~ delete _; - - private Dictionary _components = new .() ~ delete _; - private List _componentStorage = new .() ~ DeleteContainerAndDisposeItems!(_); -} \ No newline at end of file From 70b39a2b4a81c30afbe651dcd918a58cc8a381f4 Mon Sep 17 00:00:00 2001 From: Booklordofthedings Date: Sun, 17 Nov 2024 12:44:47 +0100 Subject: [PATCH 06/17] Bugfixes and more logic UList was broken a bit, and we where doing unaligned memory access + some other stuff --- src/Archetype.bf | 5 + src/CommandBuffer.bf | 14 +++ src/Containers/PagedSparseSet.bf | 2 +- src/Containers/UList.bf | 21 ++-- src/ECS.bf | 4 +- src/Example/Program.bf | 6 +- src/System.bf | 190 +++++++++++++++++++++++++------ src/SystemsManager.bf | 15 +++ 8 files changed, 203 insertions(+), 54 deletions(-) create mode 100644 src/Archetype.bf create mode 100644 src/CommandBuffer.bf create mode 100644 src/SystemsManager.bf diff --git a/src/Archetype.bf b/src/Archetype.bf new file mode 100644 index 0000000..9b4ad58 --- /dev/null +++ b/src/Archetype.bf @@ -0,0 +1,5 @@ +namespace Theater_ECS; + +abstract class Archetype +{ +} \ No newline at end of file diff --git a/src/CommandBuffer.bf b/src/CommandBuffer.bf new file mode 100644 index 0000000..ce7bdd4 --- /dev/null +++ b/src/CommandBuffer.bf @@ -0,0 +1,14 @@ +namespace Theater_ECS; + +/* + Not all actions can be done during the run of a system, + this class provides a buffer where actions are stored until a system is done running, + at which points these actions will be applied to the data store. +*/ +class CommandBuffer +{ + public void DeleteEntity(Entity e) {} + public void CreateEntity(Archetype a) {} + public void AddComponentToEntity(Entity e, Component c, void* data) {} + public void RemoveComponentFromEntity(Entity e, Component c) {} +} \ No newline at end of file diff --git a/src/Containers/PagedSparseSet.bf b/src/Containers/PagedSparseSet.bf index 568d6de..8d5084a 100644 --- a/src/Containers/PagedSparseSet.bf +++ b/src/Containers/PagedSparseSet.bf @@ -46,7 +46,7 @@ class PagedSparseSet _packed.PopBack(); } - [Inline] + [Inline, Unchecked] public void* Get(Entity e) { return _packedEntities[(.)(_sparse[e.Index/PageSize][e.Index % PageSize].Index)]; diff --git a/src/Containers/UList.bf b/src/Containers/UList.bf index d4f9713..136fd37 100644 --- a/src/Containers/UList.bf +++ b/src/Containers/UList.bf @@ -21,7 +21,7 @@ class UList /// Adds an item to the back of the list. public void Add(T* toAdd) { - if (_size == _alloc) + if (_size + strideof(T) > _alloc) Realloc(_alloc * 2); Internal.MemCpy(&((uint8*)_items)[_size], toAdd, sizeof(T)); _size += _sizeof; @@ -30,7 +30,7 @@ class UList /// Adds an item to the back of the list. public void Add(void* toAdd) { - if (_size == _alloc) + if (_size + _sizeof > _alloc) Realloc(_alloc * 2); Internal.MemCpy(&((uint8*)_items)[_size], toAdd, _sizeof); _size += _sizeof; @@ -53,40 +53,36 @@ class UList get => (_size / _sizeof); } + [Unchecked] public void* this[int_cosize index] { [Checked] get { Runtime.Assert(index < (_size/_sizeof)); - return GetItem(_items, index * _sizeof); + return (uint8*)_items + index * _sizeof; } [Unchecked, Inline] get { - return GetItem(_items, index* _sizeof); + return (uint8*)_items + index * _sizeof; } [Checked] set { Runtime.Assert(index < (_size/_sizeof)); - MemCpy(GetItem(_items, index * _sizeof), value, _sizeof); + Internal.MemCpy((uint8*)_items + index * _sizeof, value, _sizeof); } [Unchecked, Inline] set { - MemCpy(GetItem(_items, index * _sizeof), value, _sizeof); + Internal.MemCpy((uint8*)_items + index * _sizeof, value, _sizeof); } } - - private void* GetItem(void* i, int32 index) => (uint8*)i + index; - - private void MemCpy(void* dest, void* src, int lenght) => Internal.MemCpy(dest, src, lenght); - #region Initializers public this(int_cosize size) { @@ -157,6 +153,3 @@ class UList } #endregion } -/* - -*/ \ No newline at end of file diff --git a/src/ECS.bf b/src/ECS.bf index c4a4dff..b9b7afa 100644 --- a/src/ECS.bf +++ b/src/ECS.bf @@ -23,7 +23,7 @@ class ECS private ComponentRegistry _compRegistry = new .() ~ delete _; ///Registers a component but hides some of the work behind generics - public Component RegisterComponent() => _compRegistry.RegisterComponent(typeof(T).GetFullName(.. scope .()), sizeof(T)); + public Component RegisterComponent() => _compRegistry.RegisterComponent(typeof(T).GetFullName(.. scope .()), strideof(T)); public Component RegisterComponent(StringView name, int_cosize size) => _compRegistry.RegisterComponent(name, size); ///Retrieves the id of a component @@ -34,5 +34,5 @@ class ECS public Span GetComponentEntities(Component c) => _compRegistry.Components[c].GetAll(); - [Inline] public void* GetComponentData(Entity e, Component c) => _compRegistry.Components[c].Get(e); + [Inline] public void* GetComponentData(Entity e, Component c) => _compRegistry.Components[c].[Unchecked]Get(e); } \ No newline at end of file diff --git a/src/Example/Program.bf b/src/Example/Program.bf index 7878c9c..a60f1e8 100644 --- a/src/Example/Program.bf +++ b/src/Example/Program.bf @@ -20,8 +20,6 @@ class Program var entity = e.Entity_Create(); e.[Friend]_compRegistry.Components[s.[Friend]_Components[0]].Add(entity, &Position()); e.[Friend]_compRegistry.Components[s.[Friend]_Components[1]].Add(entity, &Velocity()); - /*if((gRand.NextI32() % 3) == 1) - e.[Friend]_compRegistry.Components[s.[Friend]_Components[2]].Add(entity, &waste());*/ } @@ -29,7 +27,7 @@ class Program for(int o < 10) { watch.Start(); - for(int ii < 400) + for(int ii < 10) { s.RunSystem(e); @@ -39,7 +37,7 @@ class Program watch.Stop(); watch.Reset(); } - Console.Read(); + //Console.Read(); } } diff --git a/src/System.bf b/src/System.bf index ce2f55a..3c35a88 100644 --- a/src/System.bf +++ b/src/System.bf @@ -7,6 +7,10 @@ using System.Collections; abstract class System { + public bool Paused = false; //Wether or not this service should be run + public float RuntimeDelay = 0; //How many seconds should we wait after running this system + + private List _Components = new .(10) ~ delete _; ///Get the compoent id and cache it inside of this system @@ -14,19 +18,24 @@ abstract class System public abstract void RegisterSystem(ECS ecs); + ///Yes surely this is a good idea public virtual void Run(void* p1) { }; public virtual void Run(void* p1, void* p2) { }; public virtual void Run(void* p1, void* p2, void* p3) { }; - - + public virtual void Run(void* p1, void* p2, void* p3, void* p4) { }; + public virtual void Run(void* p1, void* p2, void* p3, void* p4, void* p5) { }; + public virtual void Run(void* p1, void* p2, void* p3, void* p4, void* p5, void* p6) { }; + public virtual void Run(void* p1, void* p2, void* p3, void* p4, void* p5, void* p6, void* p7) { }; + public virtual void Run(void* p1, void* p2, void* p3, void* p4, void* p5, void* p6, void* p7, void* p8) { }; + public virtual void Run(void* p1, void* p2, void* p3, void* p4, void* p5, void* p6, void* p7, void* p8, void* p9) { }; public void RunSystem(ECS ecs) { int_cosize count = int_cosize.MaxValue; Component comp = _Components[0]; - for(var c in _Components) - if(ecs.GetComponentCount(c) < count) + for (var c in _Components) + if (ecs.GetComponentCount(c) < count) { count = ecs.GetComponentCount(c); comp = c; @@ -35,40 +44,158 @@ abstract class System //We now have the list of entities to loop through Span entities = ecs.GetComponentEntities(comp); UList main = ecs.[Friend]_compRegistry.Components[comp].[Friend]_packedEntities; + var cun = entities.Length - 1; - switch(_Components.Count) +#region DumbStatement + switch (_Components.Count) { case 1: + for (int ii < cun) + this.Run(main[(.)entities[ii].Index]); case 2: - if(comp == _Components[0]) - { - var cun = entities.Length-1; - for(int ii < cun) - { - this.Run( - main[(.)entities[ii].Index], - ecs.GetComponentData(entities[ii], _Components[1])); - } - } + if (comp == _Components[0]) + for (int ii < cun) + this.Run(main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[1])); else - { - - } - - + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index]); case 3: - var cun = entities.Length-1; - for(int ii < cun) - { - this.Run( - ecs.GetComponentData(entities[ii], _Components[0]), - ecs.GetComponentData(entities[ii], _Components[1]), - ecs.GetComponentData(entities[ii], _Components[2])); - } + if (comp == _Components[0]) + for (int ii < cun) + this.Run(main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2])); + else if (comp == _Components[1]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[2])); + else + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index]); + case 4: + if (comp == _Components[0]) + for (int ii < cun) + this.Run(main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3])); + else if (comp == _Components[1]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[2])); + else if (comp == _Components[2]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[2])); + else + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), main[(.)entities[ii].Index]); + case 5: + if (comp == _Components[0]) + for (int ii < cun) + this.Run(main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4])); + else if (comp == _Components[1]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[4])); + else if (comp == _Components[2]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[4])); + else if (comp == _Components[3]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[4])); + else + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), main[(.)entities[ii].Index]); + case 6: + if (comp == _Components[0]) + for (int ii < cun) + this.Run(main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5])); + else if (comp == _Components[1]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5])); + else if (comp == _Components[2]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5])); + else if (comp == _Components[3]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5])); + else if (comp == _Components[4]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[5])); + else + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), main[(.)entities[ii].Index]); + case 7: + if (comp == _Components[0]) + for (int ii < cun) + this.Run(main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6])); + else if (comp == _Components[1]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6])); + else if (comp == _Components[2]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6])); + else if (comp == _Components[3]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6])); + else if (comp == _Components[4]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6])); + else if (comp == _Components[5]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[6])); + else + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), main[(.)entities[ii].Index]); + case 8: + if (comp == _Components[0]) + for (int ii < cun) + this.Run(main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6]), ecs.GetComponentData(entities[ii], _Components[7])); + else if (comp == _Components[1]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6]), ecs.GetComponentData(entities[ii], _Components[7])); + else if (comp == _Components[2]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6]), ecs.GetComponentData(entities[ii], _Components[7])); + else if (comp == _Components[3]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6]), ecs.GetComponentData(entities[ii], _Components[7])); + else if (comp == _Components[4]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6]), ecs.GetComponentData(entities[ii], _Components[7])); + else if (comp == _Components[5]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[7])); + else if (comp == _Components[6]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[7])); + else + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6]), main[(.)entities[ii].Index]); + case 9: + if (comp == _Components[0]) + for (int ii < cun) + this.Run(main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6]), ecs.GetComponentData(entities[ii], _Components[7]), ecs.GetComponentData(entities[ii], _Components[8])); + else if (comp == _Components[1]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6]), ecs.GetComponentData(entities[ii], _Components[7]), ecs.GetComponentData(entities[ii], _Components[8])); + else if (comp == _Components[2]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6]), ecs.GetComponentData(entities[ii], _Components[7]), ecs.GetComponentData(entities[ii], _Components[8])); + else if (comp == _Components[3]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6]), ecs.GetComponentData(entities[ii], _Components[7]), ecs.GetComponentData(entities[ii], _Components[8])); + else if (comp == _Components[4]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6]), ecs.GetComponentData(entities[ii], _Components[7]), ecs.GetComponentData(entities[ii], _Components[8])); + else if (comp == _Components[5]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[7]), ecs.GetComponentData(entities[ii], _Components[8])); + else if (comp == _Components[6]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[7]), ecs.GetComponentData(entities[ii], _Components[8])); + else if (comp == _Components[7]) + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[8])); + else + for (int ii < cun) + this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6]), ecs.GetComponentData(entities[ii], _Components[8]), main[(.)entities[ii].Index]); } - - } +#endregion + } class MovementSystem : System @@ -76,7 +203,6 @@ class MovementSystem : System public override void RegisterSystem(ECS ecs) { RegisterComponent(ecs); - //RegisterComponent(ecs); RegisterComponent(ecs); } @@ -84,13 +210,11 @@ class MovementSystem : System { ((Position*)pos).x += ((Velocity*)vel).x; ((Position*)pos).y += ((Velocity*)vel).y; - } public override void Run(void* pos, void* waste, void* vel) { ((Position*)pos).x += ((Velocity*)vel).x; ((Position*)pos).y += ((Velocity*)vel).y; - } } \ No newline at end of file diff --git a/src/SystemsManager.bf b/src/SystemsManager.bf new file mode 100644 index 0000000..86e18a7 --- /dev/null +++ b/src/SystemsManager.bf @@ -0,0 +1,15 @@ +namespace Theater_ECS; + +using System; +using System.Collections; + +class SystemsManager +{ + private List _registeredSystems = new .() ~ delete _; + + public void RegisterSystem() + { + + } + +} \ No newline at end of file From 553b1f4166f7d5cdf61cfd8bf057b3a4cd257906 Mon Sep 17 00:00:00 2001 From: Booklordofthedings Date: Sun, 17 Nov 2024 16:59:12 +0100 Subject: [PATCH 07/17] Removed unecessary conent + bugfixes We had a bug where double registering a component errored. That was because I fucked up and used the wrong symbol name at one point. _size vs _sizeof Its fixed now --- src/ComponentRegistry.bf | 2 +- src/Example/Position.bf | 15 ------- src/Example/Program.bf | 93 ---------------------------------------- src/Example/Velocity.bf | 9 ---- src/System.bf | 22 ---------- 5 files changed, 1 insertion(+), 140 deletions(-) delete mode 100644 src/Example/Position.bf delete mode 100644 src/Example/Program.bf delete mode 100644 src/Example/Velocity.bf diff --git a/src/ComponentRegistry.bf b/src/ComponentRegistry.bf index befbb27..b04cd7e 100644 --- a/src/ComponentRegistry.bf +++ b/src/ComponentRegistry.bf @@ -18,7 +18,7 @@ class ComponentRegistry { ///Return the existing component if it matches if(_componentLookup.ContainsKeyAlt(name) - && Components[_componentLookup[scope .(name)]].[Friend]_packedEntities.[Friend]_size == size) + && Components[_componentLookup[scope .(name)]].[Friend]_packedEntities.[Friend]_sizeof == size) return _componentLookup[scope .(name)]; else if(_componentLookup.ContainsKeyAlt(name)) { diff --git a/src/Example/Position.bf b/src/Example/Position.bf deleted file mode 100644 index c2a2de0..0000000 --- a/src/Example/Position.bf +++ /dev/null @@ -1,15 +0,0 @@ -namespace Theater_ECS.Example; - -using System; - -struct Position -{ - public float x = (.)gRand.NextI32() % 25; - public float y = (.)gRand.NextI32() % 25; - - public void Update(float a, float b) mut - { - x += a; - y += b; - } -} \ No newline at end of file diff --git a/src/Example/Program.bf b/src/Example/Program.bf deleted file mode 100644 index a60f1e8..0000000 --- a/src/Example/Program.bf +++ /dev/null @@ -1,93 +0,0 @@ -namespace Theater_ECS; -using Theater_ECS.Example; -using Theater_ECS.Containers; - - -using System; -using System.Collections; - -class Program -{ - public static void Main() - { - ECS e = scope .(); - MovementSystem s = scope .(); - s.RegisterSystem(e); - - - for(int32 i < 500000) - { - var entity = e.Entity_Create(); - e.[Friend]_compRegistry.Components[s.[Friend]_Components[0]].Add(entity, &Position()); - e.[Friend]_compRegistry.Components[s.[Friend]_Components[1]].Add(entity, &Velocity()); - } - - - System.Diagnostics.Stopwatch watch = scope .(); - for(int o < 10) - { - watch.Start(); - for(int ii < 10) - { - - s.RunSystem(e); - - } - Console.WriteLine(scope $"{watch.ElapsedMilliseconds}ms"); - watch.Stop(); - watch.Reset(); - } - //Console.Read(); - } - -} - -struct waste -{ - uint32[4] asd; -} -/* - A definition of the functionality and usage of the Theater-ECS - - Goals: - - Fast - The target is handling the maximum alive at one point amount ~1 048 000 components in a single frame - - Use what you need - Allocations should be kept at a minimum (Paging), and components and systems should not be tracked unless they - are used and the user explicitly asks for them - - Dynamic - The ecs should by default be fully dynamic, meaning supporting abitrary systems and components. - Also Types should not be hardlocked to a single component, so that one type can be used for multiple - components. - - Components: - - ECS - -CreateEntity - Create a new entity and return it - -DeleteEntity - Delete the input identity - -IsAlive - Check wether a given identity is alive - -GetAllData - Return Span(ComponentId, void*) containing every component that has data on this entity - - -RegisterComponent - Create a new container and return the id of the component - -GetComponentId - Returns the component id of a given input - -AddComponentToEntity - creates a component data for the entry and returns a pointer to it - -RemoveComponentFromEntity - Deataches a component from an entity - -GetComponentData - Returns a Span for a given component - - -RegisterSystem - Add a system the the ecs object - -RunSystem - Run a single run of a system without registering it - -RunSystems - Run all available systems - -GetSystemEnumerator - Retrieve an IEnumerable for a given set of component IDS -*/ \ No newline at end of file diff --git a/src/Example/Velocity.bf b/src/Example/Velocity.bf deleted file mode 100644 index 8067be8..0000000 --- a/src/Example/Velocity.bf +++ /dev/null @@ -1,9 +0,0 @@ -namespace Theater_ECS.Example; - -using System; - -struct Velocity -{ - public float x = (.)gRand.NextI32() % 25; - public float y = (.)gRand.NextI32() % 25; -} \ No newline at end of file diff --git a/src/System.bf b/src/System.bf index 3c35a88..f920ff1 100644 --- a/src/System.bf +++ b/src/System.bf @@ -1,6 +1,5 @@ namespace Theater_ECS; using Theater_ECS.Containers; -using Theater_ECS.Example; using System; using System.Collections; @@ -196,25 +195,4 @@ abstract class System } #endregion -} - -class MovementSystem : System -{ - public override void RegisterSystem(ECS ecs) - { - RegisterComponent(ecs); - RegisterComponent(ecs); - } - - public override void Run(void* pos, void* vel) - { - ((Position*)pos).x += ((Velocity*)vel).x; - ((Position*)pos).y += ((Velocity*)vel).y; - } - - public override void Run(void* pos, void* waste, void* vel) - { - ((Position*)pos).x += ((Velocity*)vel).x; - ((Position*)pos).y += ((Velocity*)vel).y; - } } \ No newline at end of file From a8ac473666d795f848e887a0e02daa17633b9a52 Mon Sep 17 00:00:00 2001 From: Booklordofthedings Date: Sun, 17 Nov 2024 22:15:58 +0100 Subject: [PATCH 08/17] Some changes regarding ownership and making the api better --- ...mponentRegistry.bf => ComponentManager.bf} | 2 +- src/DeleteECSAndItems.bf | 16 +++++ src/ECS.bf | 5 +- src/SystemsManager.bf | 63 +++++++++++++++++-- 4 files changed, 80 insertions(+), 6 deletions(-) rename src/{ComponentRegistry.bf => ComponentManager.bf} (98%) create mode 100644 src/DeleteECSAndItems.bf diff --git a/src/ComponentRegistry.bf b/src/ComponentManager.bf similarity index 98% rename from src/ComponentRegistry.bf rename to src/ComponentManager.bf index b04cd7e..b6e6696 100644 --- a/src/ComponentRegistry.bf +++ b/src/ComponentManager.bf @@ -6,7 +6,7 @@ using System.Collections; typealias Component = int_cosize; -class ComponentRegistry +class ComponentManager { private Dictionary _componentLookup = new .() ~ DeleteDictionaryAndKeys!(_); diff --git a/src/DeleteECSAndItems.bf b/src/DeleteECSAndItems.bf new file mode 100644 index 0000000..805217b --- /dev/null +++ b/src/DeleteECSAndItems.bf @@ -0,0 +1,16 @@ +namespace Theater_ECS; + +static +{ + /* + This exists for ownership reasons + If this mixin isnt called the ecs will not delete any allocated data passed into it + from the outside. + */ + public static mixin DeleteECSAndItems(ECS e) + { + DeleteDictionaryAndKeysAndValues!(e.Systems); + e.Systems = null; + delete e; + } +} \ No newline at end of file diff --git a/src/ECS.bf b/src/ECS.bf index b9b7afa..790312f 100644 --- a/src/ECS.bf +++ b/src/ECS.bf @@ -20,7 +20,7 @@ class ECS //TODO: Entity_GetAllComponents - private ComponentRegistry _compRegistry = new .() ~ delete _; + private ComponentManager _compRegistry = new .() ~ delete _; ///Registers a component but hides some of the work behind generics public Component RegisterComponent() => _compRegistry.RegisterComponent(typeof(T).GetFullName(.. scope .()), strideof(T)); @@ -35,4 +35,7 @@ class ECS public Span GetComponentEntities(Component c) => _compRegistry.Components[c].GetAll(); [Inline] public void* GetComponentData(Entity e, Component c) => _compRegistry.Components[c].[Unchecked]Get(e); + + public SystemsManager Systems = new .(this) ~ delete _; + public ComponentManager Components = new .() ~ delete _; } \ No newline at end of file diff --git a/src/SystemsManager.bf b/src/SystemsManager.bf index 86e18a7..879afbf 100644 --- a/src/SystemsManager.bf +++ b/src/SystemsManager.bf @@ -3,13 +3,68 @@ namespace Theater_ECS; using System; using System.Collections; -class SystemsManager +class SystemsManager : IEnumerable<(String key, System value)> { - private List _registeredSystems = new .() ~ delete _; + private ECS _owner; + private Dictionary _registeredSystems = new .() ~ delete _; - public void RegisterSystem() + public this(ECS ecs) { - + _owner = ecs; } + ///Registers a system and returns false if its already contained + public bool RegisterSystem(System sys, StringView id) + { + if (_registeredSystems.ContainsKeyAlt(id)) + return false; + _registeredSystems.Add(new .(id), sys); + sys.RegisterSystem(_owner); + return true; + } + + ///Deregister a single system + public Result DeregisterSystem(StringView id) + { + if (!_registeredSystems.ContainsKeyAlt(id)) + return .Err; + return .Ok(_registeredSystems.GetAndRemoveAlt(id).Value.value); + } + + ///Remove all systems from use and return the amount of systems cleared + public int ClearAllSystems() + { + var c = _registeredSystems.Count; + _registeredSystems.Clear(); + return c; + } + + ///Runs all systems once + public void RunAllSystems(ECS ecs) + { + for (var i in _registeredSystems) + i.value.RunSystem(ecs); + } + + ///Run a single system + public Result RunSystem(StringView id, ECS ecs) + { + if (!_registeredSystems.ContainsKeyAlt(id)) + return .Err; + + _registeredSystems[scope .(id)].RunSystem(ecs); + + return .Ok; + } + + ///Runs a function over all systems + public void EnumerateSystems(delegate void(System) func) + { + for (var i in _registeredSystems) + func.Invoke(i.value); + } + + public int Count => _registeredSystems.Count; + + public Dictionary.Enumerator GetEnumerator() => _registeredSystems.GetEnumerator(); } \ No newline at end of file From 499cea5b4497e73b58124819e8ad466e0761ac10 Mon Sep 17 00:00:00 2001 From: Booklordofthedings Date: Mon, 18 Nov 2024 10:29:35 +0100 Subject: [PATCH 09/17] Change api to support archetypes and move stuff to different namespaces --- src/Archetype.bf | 6 +- src/Component.bf | 5 + src/ECS.bf | 33 +----- .../Containers}/CommandBuffer.bf | 4 +- .../Containers/PagedSparseSet.bf | 2 +- src/{ => Internal}/Containers/UList.bf | 5 +- .../Managers}/ComponentManager.bf | 16 +-- .../Managers/EntityManager.bf} | 17 ++- src/{ => Internal/Managers}/SystemsManager.bf | 2 +- src/System.bf | 100 +++++++++--------- 10 files changed, 93 insertions(+), 97 deletions(-) create mode 100644 src/Component.bf rename src/{ => Internal/Containers}/CommandBuffer.bf (82%) rename src/{ => Internal}/Containers/PagedSparseSet.bf (97%) rename src/{ => Internal}/Containers/UList.bf (97%) rename src/{ => Internal/Managers}/ComponentManager.bf (80%) rename src/{EntityRegister.bf => Internal/Managers/EntityManager.bf} (77%) rename src/{ => Internal/Managers}/SystemsManager.bf (97%) diff --git a/src/Archetype.bf b/src/Archetype.bf index 9b4ad58..e634c53 100644 --- a/src/Archetype.bf +++ b/src/Archetype.bf @@ -1,5 +1,9 @@ namespace Theater_ECS; -abstract class Archetype +using System; +using System.Collections; + +interface IArchetypeable { + public void Instantiate(ECS ecs, Entity e); } \ No newline at end of file diff --git a/src/Component.bf b/src/Component.bf new file mode 100644 index 0000000..fe76930 --- /dev/null +++ b/src/Component.bf @@ -0,0 +1,5 @@ +namespace Theater_ECS; + +using System; + +typealias Component = int_cosize; \ No newline at end of file diff --git a/src/ECS.bf b/src/ECS.bf index 790312f..cb8fc07 100644 --- a/src/ECS.bf +++ b/src/ECS.bf @@ -1,41 +1,12 @@ namespace Theater_ECS; -using Theater_ECS.Containers; +using Theater_ECS.Internal.Managers; using System; using System.Collections; class ECS { - private EntityRegister _registry = new .() ~ delete _; - - ///Create a new Entity - public Entity Entity_Create() => _registry.Create(); - - ///Delete an Entity - public void Entity_Delete(Entity e) => _registry.Remove(e); - - ///Returns wether the given entity is still alive - public bool Entity_Alive(Entity e) => _registry.IsAlive(e); - - //TODO: Entity_GetAllComponents - - - private ComponentManager _compRegistry = new .() ~ delete _; - - ///Registers a component but hides some of the work behind generics - public Component RegisterComponent() => _compRegistry.RegisterComponent(typeof(T).GetFullName(.. scope .()), strideof(T)); - public Component RegisterComponent(StringView name, int_cosize size) => _compRegistry.RegisterComponent(name, size); - - ///Retrieves the id of a component - public Result GetComponent() => _compRegistry.GetComponent(typeof(T).GetFullName(.. scope .())); - public Result GetComponent(StringView name) => _compRegistry.GetComponent(name); - - public int_cosize GetComponentCount(Component c) => _compRegistry.Components[c].Count(); - - public Span GetComponentEntities(Component c) => _compRegistry.Components[c].GetAll(); - - [Inline] public void* GetComponentData(Entity e, Component c) => _compRegistry.Components[c].[Unchecked]Get(e); - public SystemsManager Systems = new .(this) ~ delete _; public ComponentManager Components = new .() ~ delete _; + public EntityManager Entities = new .(this) ~ delete _; } \ No newline at end of file diff --git a/src/CommandBuffer.bf b/src/Internal/Containers/CommandBuffer.bf similarity index 82% rename from src/CommandBuffer.bf rename to src/Internal/Containers/CommandBuffer.bf index ce7bdd4..a691029 100644 --- a/src/CommandBuffer.bf +++ b/src/Internal/Containers/CommandBuffer.bf @@ -1,4 +1,4 @@ -namespace Theater_ECS; +namespace Theater_ECS.Internal.Containers; /* Not all actions can be done during the run of a system, @@ -8,7 +8,7 @@ namespace Theater_ECS; class CommandBuffer { public void DeleteEntity(Entity e) {} - public void CreateEntity(Archetype a) {} + public void CreateEntity(IArchetypeable a) {} public void AddComponentToEntity(Entity e, Component c, void* data) {} public void RemoveComponentFromEntity(Entity e, Component c) {} } \ No newline at end of file diff --git a/src/Containers/PagedSparseSet.bf b/src/Internal/Containers/PagedSparseSet.bf similarity index 97% rename from src/Containers/PagedSparseSet.bf rename to src/Internal/Containers/PagedSparseSet.bf index 8d5084a..cbfc48d 100644 --- a/src/Containers/PagedSparseSet.bf +++ b/src/Internal/Containers/PagedSparseSet.bf @@ -1,4 +1,4 @@ -namespace Theater_ECS.Containers; +namespace Theater_ECS.Internal.Containers; using System; using System.Collections; diff --git a/src/Containers/UList.bf b/src/Internal/Containers/UList.bf similarity index 97% rename from src/Containers/UList.bf rename to src/Internal/Containers/UList.bf index 136fd37..44917c0 100644 --- a/src/Containers/UList.bf +++ b/src/Internal/Containers/UList.bf @@ -1,10 +1,9 @@ -namespace Theater_ECS.Containers; +namespace Theater_ECS.Internal.Containers; using System; using System.Collections; -using System.Diagnostics; -using System.Diagnostics.Contracts; using System.Threading; +using System.Diagnostics; using System.Reflection; //A variant of list, which has no type associated with it diff --git a/src/ComponentManager.bf b/src/Internal/Managers/ComponentManager.bf similarity index 80% rename from src/ComponentManager.bf rename to src/Internal/Managers/ComponentManager.bf index b6e6696..264bed1 100644 --- a/src/ComponentManager.bf +++ b/src/Internal/Managers/ComponentManager.bf @@ -1,14 +1,11 @@ -namespace Theater_ECS; -using Theater_ECS.Containers; +namespace Theater_ECS.Internal.Managers; +using Theater_ECS.Internal.Containers; using System; using System.Collections; -typealias Component = int_cosize; - class ComponentManager { - private Dictionary _componentLookup = new .() ~ DeleteDictionaryAndKeys!(_); public List Components = new .() ~ DeleteContainerAndItems!(_); @@ -41,12 +38,19 @@ class ComponentManager return (.)(Components.Count-1); } + [Inline] + public void* GetComponentData(Entity e, Component c) => Components[c].[Unchecked]Get(e); + ///Retrieves the id of a component - public Result GetComponent(StringView name) + public Result GetId(StringView name) { if(!_componentLookup.ContainsKeyAlt(name)) return .Err; return _componentLookup[scope .(name)]; } + public void AddComponentToEntity(Entity e, Component c, void* data) + { + Components[c].Add(e, data); + } } \ No newline at end of file diff --git a/src/EntityRegister.bf b/src/Internal/Managers/EntityManager.bf similarity index 77% rename from src/EntityRegister.bf rename to src/Internal/Managers/EntityManager.bf index 66a2d6d..aeaa6e7 100644 --- a/src/EntityRegister.bf +++ b/src/Internal/Managers/EntityManager.bf @@ -1,14 +1,20 @@ -namespace Theater_ECS; +namespace Theater_ECS.Internal.Managers; using System; using System.Collections; -class EntityRegister +class EntityManager { + private ECS _owner; + private List _entities = new .() ~ delete _; private int32 _available = 0; private Entity _next = .Null; + public this(ECS ecs) + { + _owner = ecs; + } public Entity Create() { @@ -32,6 +38,13 @@ class EntityRegister } } + public Entity Create(IArchetypeable archetype) + { + var e = this.Create(); + archetype.Instantiate(_owner, e); + return e; + } + public void Remove(Entity e) { let temp = _next; diff --git a/src/SystemsManager.bf b/src/Internal/Managers/SystemsManager.bf similarity index 97% rename from src/SystemsManager.bf rename to src/Internal/Managers/SystemsManager.bf index 879afbf..5685652 100644 --- a/src/SystemsManager.bf +++ b/src/Internal/Managers/SystemsManager.bf @@ -1,4 +1,4 @@ -namespace Theater_ECS; +namespace Theater_ECS.Internal.Managers; using System; using System.Collections; diff --git a/src/System.bf b/src/System.bf index f920ff1..c7037aa 100644 --- a/src/System.bf +++ b/src/System.bf @@ -1,5 +1,5 @@ namespace Theater_ECS; -using Theater_ECS.Containers; +using Theater_ECS.Internal.Containers; using System; using System.Collections; @@ -13,7 +13,7 @@ abstract class System private List _Components = new .(10) ~ delete _; ///Get the compoent id and cache it inside of this system - public void RegisterComponent(ECS ecs) where T : struct => _Components.Add(ecs.RegisterComponent()); + public void RegisterComponent(ECS ecs) where T : struct => _Components.Add(ecs.Components.RegisterComponent(typeof(T).GetFullName(.. scope .()), strideof(T))); public abstract void RegisterSystem(ECS ecs); @@ -34,15 +34,15 @@ abstract class System Component comp = _Components[0]; for (var c in _Components) - if (ecs.GetComponentCount(c) < count) + if (ecs.Components.Components[c].Count() < count) { - count = ecs.GetComponentCount(c); + count = ecs.Components.Components[c].Count(); comp = c; } //We now have the list of entities to loop through - Span entities = ecs.GetComponentEntities(comp); - UList main = ecs.[Friend]_compRegistry.Components[comp].[Friend]_packedEntities; + Span entities = ecs.Components.Components[comp].GetAll(); + UList main = ecs.Components.Components[comp].[Friend]_packedEntities; var cun = entities.Length - 1; #region DumbStatement @@ -54,143 +54,143 @@ abstract class System case 2: if (comp == _Components[0]) for (int ii < cun) - this.Run(main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[1])); + this.Run(main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[1])); else for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index]); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index]); case 3: if (comp == _Components[0]) for (int ii < cun) - this.Run(main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2])); + this.Run(main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2])); else if (comp == _Components[1]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[2])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[2])); else for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index]); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index]); case 4: if (comp == _Components[0]) for (int ii < cun) - this.Run(main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3])); + this.Run(main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3])); else if (comp == _Components[1]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[2])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[2])); else if (comp == _Components[2]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[2])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[2])); else for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), main[(.)entities[ii].Index]); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), main[(.)entities[ii].Index]); case 5: if (comp == _Components[0]) for (int ii < cun) - this.Run(main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4])); + this.Run(main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4])); else if (comp == _Components[1]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[4])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[4])); else if (comp == _Components[2]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[4])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[4])); else if (comp == _Components[3]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[4])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[4])); else for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), main[(.)entities[ii].Index]); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), main[(.)entities[ii].Index]); case 6: if (comp == _Components[0]) for (int ii < cun) - this.Run(main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5])); + this.Run(main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5])); else if (comp == _Components[1]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5])); else if (comp == _Components[2]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5])); else if (comp == _Components[3]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5])); else if (comp == _Components[4]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[5])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[5])); else for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), main[(.)entities[ii].Index]); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), main[(.)entities[ii].Index]); case 7: if (comp == _Components[0]) for (int ii < cun) - this.Run(main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6])); + this.Run(main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6])); else if (comp == _Components[1]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6])); else if (comp == _Components[2]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6])); else if (comp == _Components[3]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6])); else if (comp == _Components[4]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6])); else if (comp == _Components[5]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[6])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[6])); else for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), main[(.)entities[ii].Index]); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), main[(.)entities[ii].Index]); case 8: if (comp == _Components[0]) for (int ii < cun) - this.Run(main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6]), ecs.GetComponentData(entities[ii], _Components[7])); + this.Run(main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6]), ecs.Components.GetComponentData(entities[ii], _Components[7])); else if (comp == _Components[1]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6]), ecs.GetComponentData(entities[ii], _Components[7])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6]), ecs.Components.GetComponentData(entities[ii], _Components[7])); else if (comp == _Components[2]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6]), ecs.GetComponentData(entities[ii], _Components[7])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6]), ecs.Components.GetComponentData(entities[ii], _Components[7])); else if (comp == _Components[3]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6]), ecs.GetComponentData(entities[ii], _Components[7])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6]), ecs.Components.GetComponentData(entities[ii], _Components[7])); else if (comp == _Components[4]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6]), ecs.GetComponentData(entities[ii], _Components[7])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6]), ecs.Components.GetComponentData(entities[ii], _Components[7])); else if (comp == _Components[5]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[7])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[7])); else if (comp == _Components[6]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[7])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[7])); else for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6]), main[(.)entities[ii].Index]); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6]), main[(.)entities[ii].Index]); case 9: if (comp == _Components[0]) for (int ii < cun) - this.Run(main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6]), ecs.GetComponentData(entities[ii], _Components[7]), ecs.GetComponentData(entities[ii], _Components[8])); + this.Run(main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6]), ecs.Components.GetComponentData(entities[ii], _Components[7]), ecs.Components.GetComponentData(entities[ii], _Components[8])); else if (comp == _Components[1]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6]), ecs.GetComponentData(entities[ii], _Components[7]), ecs.GetComponentData(entities[ii], _Components[8])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6]), ecs.Components.GetComponentData(entities[ii], _Components[7]), ecs.Components.GetComponentData(entities[ii], _Components[8])); else if (comp == _Components[2]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6]), ecs.GetComponentData(entities[ii], _Components[7]), ecs.GetComponentData(entities[ii], _Components[8])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6]), ecs.Components.GetComponentData(entities[ii], _Components[7]), ecs.Components.GetComponentData(entities[ii], _Components[8])); else if (comp == _Components[3]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6]), ecs.GetComponentData(entities[ii], _Components[7]), ecs.GetComponentData(entities[ii], _Components[8])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6]), ecs.Components.GetComponentData(entities[ii], _Components[7]), ecs.Components.GetComponentData(entities[ii], _Components[8])); else if (comp == _Components[4]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6]), ecs.GetComponentData(entities[ii], _Components[7]), ecs.GetComponentData(entities[ii], _Components[8])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6]), ecs.Components.GetComponentData(entities[ii], _Components[7]), ecs.Components.GetComponentData(entities[ii], _Components[8])); else if (comp == _Components[5]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[7]), ecs.GetComponentData(entities[ii], _Components[8])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[7]), ecs.Components.GetComponentData(entities[ii], _Components[8])); else if (comp == _Components[6]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[7]), ecs.GetComponentData(entities[ii], _Components[8])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[7]), ecs.Components.GetComponentData(entities[ii], _Components[8])); else if (comp == _Components[7]) for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6]), main[(.)entities[ii].Index], ecs.GetComponentData(entities[ii], _Components[8])); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[8])); else for (int ii < cun) - this.Run(ecs.GetComponentData(entities[ii], _Components[0]), ecs.GetComponentData(entities[ii], _Components[1]), ecs.GetComponentData(entities[ii], _Components[2]), ecs.GetComponentData(entities[ii], _Components[3]), ecs.GetComponentData(entities[ii], _Components[4]), ecs.GetComponentData(entities[ii], _Components[5]), ecs.GetComponentData(entities[ii], _Components[6]), ecs.GetComponentData(entities[ii], _Components[8]), main[(.)entities[ii].Index]); + this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6]), ecs.Components.GetComponentData(entities[ii], _Components[8]), main[(.)entities[ii].Index]); } } #endregion From 34b929c4e737d22ab92c1f8c0e5fb64fd4ac8fba Mon Sep 17 00:00:00 2001 From: Booklordofthedings Date: Tue, 19 Nov 2024 14:14:19 +0100 Subject: [PATCH 10/17] Fixing up the component api to be more useable --- src/Internal/Containers/PagedSparseSet.bf | 5 +- src/Internal/Managers/ComponentManager.bf | 16 ++++- src/Internal/SystemSection.bf | 24 +++++++ src/System.bf | 88 +++++++++++------------ 4 files changed, 84 insertions(+), 49 deletions(-) create mode 100644 src/Internal/SystemSection.bf diff --git a/src/Internal/Containers/PagedSparseSet.bf b/src/Internal/Containers/PagedSparseSet.bf index cbfc48d..acc0c34 100644 --- a/src/Internal/Containers/PagedSparseSet.bf +++ b/src/Internal/Containers/PagedSparseSet.bf @@ -29,11 +29,11 @@ class PagedSparseSet _sparse[e.Index/PageSize][e.Index % PageSize] = (.)_packed.Count-1; } - public void Remove(Entity e) + public bool Remove(Entity e) { EnsurePage(e.Index/PageSize); if(_sparse[e.Index/PageSize] == null) - return; + return false; let toRm = _packed[_sparse[e.Index/PageSize][e.Index % PageSize].Index]; let b = _packed.Back; @@ -44,6 +44,7 @@ class PagedSparseSet _sparse[e.Index/PageSize][e.Index % PageSize] = Entity.Null; _packed.PopBack(); + return true; } [Inline, Unchecked] diff --git a/src/Internal/Managers/ComponentManager.bf b/src/Internal/Managers/ComponentManager.bf index 264bed1..1e0d0f5 100644 --- a/src/Internal/Managers/ComponentManager.bf +++ b/src/Internal/Managers/ComponentManager.bf @@ -39,7 +39,7 @@ class ComponentManager } [Inline] - public void* GetComponentData(Entity e, Component c) => Components[c].[Unchecked]Get(e); + public void* GetData(Entity e, Component c) => Components[c].[Unchecked]Get(e); ///Retrieves the id of a component public Result GetId(StringView name) @@ -49,8 +49,18 @@ class ComponentManager return _componentLookup[scope .(name)]; } - public void AddComponentToEntity(Entity e, Component c, void* data) + public void AddToEntity(Entity e, Component c, void* data) => Components[c].Add(e, data); + + ///Remove a component from the given entity + public bool RemoveFromEntity(Entity e, Component c) => Components[c].Remove(e); + + ///Remove a component from the given entity and return it + public Result GetAndRemoveFromEntity(Entity e, Component c) { - Components[c].Add(e, data); + if(!Components[c].Contains(e)) + return .Err; + var data = [Unchecked]Components[c].Get(e); + Components[c].Remove(e); + return .Ok(data); } } \ No newline at end of file diff --git a/src/Internal/SystemSection.bf b/src/Internal/SystemSection.bf new file mode 100644 index 0000000..126b5ee --- /dev/null +++ b/src/Internal/SystemSection.bf @@ -0,0 +1,24 @@ +namespace Theater_ECS.Internal; + +using System; + +//Indicates when systems should be run in relation to each other +//Higher = Later +//Can be extended with own types +//Not all types have to be used +struct SystemSection : uint8 +{ + public const SystemSection TECS_Input = 0; + + public const SystemSection TECS_EarlyUpdate = 5; + public const SystemSection TECS_Update = 10; + public const SystemSection TECS_LateUpdate = 15; + + public const SystemSection TECS_EarlyRendering = 20; + public const SystemSection TECS_Rendering = 25; + public const SystemSection TECS_LateRendering = 30; + + public const SystemSection TECS_Last = 40; + + private this() {} +} \ No newline at end of file diff --git a/src/System.bf b/src/System.bf index c7037aa..a75babb 100644 --- a/src/System.bf +++ b/src/System.bf @@ -54,143 +54,143 @@ abstract class System case 2: if (comp == _Components[0]) for (int ii < cun) - this.Run(main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[1])); + this.Run(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1])); else for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index]); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index]); case 3: if (comp == _Components[0]) for (int ii < cun) - this.Run(main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2])); + this.Run(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2])); else if (comp == _Components[1]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[2])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2])); else for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index]); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index]); case 4: if (comp == _Components[0]) for (int ii < cun) - this.Run(main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3])); + this.Run(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3])); else if (comp == _Components[1]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[2])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[2])); else if (comp == _Components[2]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[2])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2])); else for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), main[(.)entities[ii].Index]); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), main[(.)entities[ii].Index]); case 5: if (comp == _Components[0]) for (int ii < cun) - this.Run(main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4])); + this.Run(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4])); else if (comp == _Components[1]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[4])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4])); else if (comp == _Components[2]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[4])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4])); else if (comp == _Components[3]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[4])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[4])); else for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), main[(.)entities[ii].Index]); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), main[(.)entities[ii].Index]); case 6: if (comp == _Components[0]) for (int ii < cun) - this.Run(main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5])); + this.Run(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5])); else if (comp == _Components[1]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5])); else if (comp == _Components[2]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5])); else if (comp == _Components[3]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5])); else if (comp == _Components[4]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[5])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[5])); else for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), main[(.)entities[ii].Index]); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), main[(.)entities[ii].Index]); case 7: if (comp == _Components[0]) for (int ii < cun) - this.Run(main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6])); + this.Run(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6])); else if (comp == _Components[1]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6])); else if (comp == _Components[2]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6])); else if (comp == _Components[3]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6])); else if (comp == _Components[4]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6])); else if (comp == _Components[5]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[6])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[6])); else for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), main[(.)entities[ii].Index]); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), main[(.)entities[ii].Index]); case 8: if (comp == _Components[0]) for (int ii < cun) - this.Run(main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6]), ecs.Components.GetComponentData(entities[ii], _Components[7])); + this.Run(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7])); else if (comp == _Components[1]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6]), ecs.Components.GetComponentData(entities[ii], _Components[7])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7])); else if (comp == _Components[2]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6]), ecs.Components.GetComponentData(entities[ii], _Components[7])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7])); else if (comp == _Components[3]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6]), ecs.Components.GetComponentData(entities[ii], _Components[7])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7])); else if (comp == _Components[4]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6]), ecs.Components.GetComponentData(entities[ii], _Components[7])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7])); else if (comp == _Components[5]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[7])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[7])); else if (comp == _Components[6]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[7])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[7])); else for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6]), main[(.)entities[ii].Index]); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), main[(.)entities[ii].Index]); case 9: if (comp == _Components[0]) for (int ii < cun) - this.Run(main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6]), ecs.Components.GetComponentData(entities[ii], _Components[7]), ecs.Components.GetComponentData(entities[ii], _Components[8])); + this.Run(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); else if (comp == _Components[1]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6]), ecs.Components.GetComponentData(entities[ii], _Components[7]), ecs.Components.GetComponentData(entities[ii], _Components[8])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); else if (comp == _Components[2]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6]), ecs.Components.GetComponentData(entities[ii], _Components[7]), ecs.Components.GetComponentData(entities[ii], _Components[8])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); else if (comp == _Components[3]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6]), ecs.Components.GetComponentData(entities[ii], _Components[7]), ecs.Components.GetComponentData(entities[ii], _Components[8])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); else if (comp == _Components[4]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6]), ecs.Components.GetComponentData(entities[ii], _Components[7]), ecs.Components.GetComponentData(entities[ii], _Components[8])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); else if (comp == _Components[5]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[7]), ecs.Components.GetComponentData(entities[ii], _Components[8])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); else if (comp == _Components[6]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[7]), ecs.Components.GetComponentData(entities[ii], _Components[8])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); else if (comp == _Components[7]) for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6]), main[(.)entities[ii].Index], ecs.Components.GetComponentData(entities[ii], _Components[8])); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[8])); else for (int ii < cun) - this.Run(ecs.Components.GetComponentData(entities[ii], _Components[0]), ecs.Components.GetComponentData(entities[ii], _Components[1]), ecs.Components.GetComponentData(entities[ii], _Components[2]), ecs.Components.GetComponentData(entities[ii], _Components[3]), ecs.Components.GetComponentData(entities[ii], _Components[4]), ecs.Components.GetComponentData(entities[ii], _Components[5]), ecs.Components.GetComponentData(entities[ii], _Components[6]), ecs.Components.GetComponentData(entities[ii], _Components[8]), main[(.)entities[ii].Index]); + this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[8]), main[(.)entities[ii].Index]); } } #endregion From 6cd249dc5b521e796f32ba60119300073d45e193 Mon Sep 17 00:00:00 2001 From: Booklordofthedings Date: Tue, 19 Nov 2024 16:27:52 +0100 Subject: [PATCH 11/17] Added section ordering for systems runtime --- src/Internal/Containers/PagedSparseSet.bf | 7 +- src/Internal/Managers/ComponentManager.bf | 5 +- src/Internal/Managers/SystemsManager.bf | 111 ++++++++++++++++++++-- src/System.bf | 2 + 4 files changed, 117 insertions(+), 8 deletions(-) diff --git a/src/Internal/Containers/PagedSparseSet.bf b/src/Internal/Containers/PagedSparseSet.bf index acc0c34..826ce2d 100644 --- a/src/Internal/Containers/PagedSparseSet.bf +++ b/src/Internal/Containers/PagedSparseSet.bf @@ -11,6 +11,8 @@ class PagedSparseSet private List _packed = new .() ~ delete _; private UList _packedEntities ~ delete _; + private function void(void* data) _deallocationFunction = null; + public this(int_cosize size) { _packedEntities = new .(size); @@ -29,12 +31,15 @@ class PagedSparseSet _sparse[e.Index/PageSize][e.Index % PageSize] = (.)_packed.Count-1; } - public bool Remove(Entity e) + public bool Remove(Entity e, bool cleanup = false) { EnsurePage(e.Index/PageSize); if(_sparse[e.Index/PageSize] == null) return false; + if(_deallocationFunction != null && !cleanup) + _deallocationFunction(_packedEntities[(.)(_sparse[e.Index/PageSize][e.Index % PageSize].Index)]); + let toRm = _packed[_sparse[e.Index/PageSize][e.Index % PageSize].Index]; let b = _packed.Back; _packed[_sparse[e.Index/PageSize][e.Index % PageSize].Index] = b; diff --git a/src/Internal/Managers/ComponentManager.bf b/src/Internal/Managers/ComponentManager.bf index 1e0d0f5..e62c226 100644 --- a/src/Internal/Managers/ComponentManager.bf +++ b/src/Internal/Managers/ComponentManager.bf @@ -38,6 +38,9 @@ class ComponentManager return (.)(Components.Count-1); } + ///Sets a function that should be called, when an object gets removed + public void SetDeallocationFunction(Component c, function void(void*) func) => Components[c].[Friend]_deallocationFunction = func; + [Inline] public void* GetData(Entity e, Component c) => Components[c].[Unchecked]Get(e); @@ -52,7 +55,7 @@ class ComponentManager public void AddToEntity(Entity e, Component c, void* data) => Components[c].Add(e, data); ///Remove a component from the given entity - public bool RemoveFromEntity(Entity e, Component c) => Components[c].Remove(e); + public bool RemoveFromEntity(Entity e, Component c) => Components[c].Remove(e, true); ///Remove a component from the given entity and return it public Result GetAndRemoveFromEntity(Entity e, Component c) diff --git a/src/Internal/Managers/SystemsManager.bf b/src/Internal/Managers/SystemsManager.bf index 5685652..d9522ea 100644 --- a/src/Internal/Managers/SystemsManager.bf +++ b/src/Internal/Managers/SystemsManager.bf @@ -7,6 +7,11 @@ class SystemsManager : IEnumerable<(String key, System value)> { private ECS _owner; private Dictionary _registeredSystems = new .() ~ delete _; + private Dictionary _registeredLooseSystems = new .() ~ DeleteDictionaryAndKeys!(_); + + private bool _dirty = false; + private List _sortedSystems = new .() ~ delete _; + private List<(function void(ECS), float, SystemSection)> _sortedLooseSystems = new .() ~ delete _; public this(ECS ecs) { @@ -16,34 +21,103 @@ class SystemsManager : IEnumerable<(String key, System value)> ///Registers a system and returns false if its already contained public bool RegisterSystem(System sys, StringView id) { - if (_registeredSystems.ContainsKeyAlt(id)) + if (_registeredSystems.ContainsKeyAlt(id) || _registeredLooseSystems.ContainsKeyAlt(id)) return false; + _dirty = true; _registeredSystems.Add(new .(id), sys); sys.RegisterSystem(_owner); return true; } + ///Register a system without an actual system object + public bool RegisterLooseSystem(StringView id, function void(ECS) func, float runtimeDelay = 0, SystemSection section = .TECS_Update) + { + if (_registeredSystems.ContainsKeyAlt(id) || _registeredLooseSystems.ContainsKeyAlt(id)) + return false; + _dirty = true; + _registeredLooseSystems.Add(new .(id), (func, runtimeDelay, section)); + return true; + } + ///Deregister a single system public Result DeregisterSystem(StringView id) { - if (!_registeredSystems.ContainsKeyAlt(id)) + _dirty = true; + if (!(_registeredSystems.ContainsKeyAlt(id) || _registeredLooseSystems.ContainsKeyAlt(id))) return .Err; - return .Ok(_registeredSystems.GetAndRemoveAlt(id).Value.value); + if (_registeredSystems.ContainsKeyAlt(id)) + return .Ok(_registeredSystems.GetAndRemoveAlt(id).Value.value); + else + { + _registeredLooseSystems.Remove(scope .(id)); + return .Ok(null); + } } ///Remove all systems from use and return the amount of systems cleared public int ClearAllSystems() { + _dirty = true; var c = _registeredSystems.Count; _registeredSystems.Clear(); return c; } ///Runs all systems once - public void RunAllSystems(ECS ecs) + public void RunAllSystems(ECS ecs, float delta = 0) { - for (var i in _registeredSystems) - i.value.RunSystem(ecs); + if (_dirty) + { + SortSystemPriorites(); + _dirty = false; + } + + int counter = 0; + int counterLoose = 0; + + for (uint8 section <= 255) + { + if (_sortedSystems.Count > counter) + while (_sortedSystems[counter].Section == (.)section) + { + _sortedSystems[counter].RunSystem(ecs); + counter++; + } + + if (_sortedLooseSystems.Count > counterLoose) + while (_sortedLooseSystems[counterLoose].2 == (.)section) + { + _sortedLooseSystems[counterLoose].0(ecs); + counter++; + } + } + } + + ///Run all systems with a specific section + public void RunSystemsBySection(ECS ecs, SystemSection section, float delta = 0) + { + if (_dirty) + { + SortSystemPriorites(); + _dirty = false; + } + + int counter = 0; + int counterLoose = 0; + + if (_sortedSystems.Count > counter) + while (_sortedSystems[counter].Section == (.)section) + { + _sortedSystems[counter].RunSystem(ecs); + counter++; + } + + if (_sortedLooseSystems.Count > counterLoose) + while (_sortedLooseSystems[counterLoose].2 == (.)section) + { + _sortedLooseSystems[counterLoose].0(ecs); + counter++; + } } ///Run a single system @@ -67,4 +141,29 @@ class SystemsManager : IEnumerable<(String key, System value)> public int Count => _registeredSystems.Count; public Dictionary.Enumerator GetEnumerator() => _registeredSystems.GetEnumerator(); + public Dictionary.Enumerator GetLooseEnumerator() => _registeredLooseSystems.GetEnumerator(); + + + private void SortSystemPriorites() + { + _sortedSystems.Clear(); + _sortedLooseSystems.Clear(); + + for (var i in _registeredSystems) + _sortedSystems.Add(i.value); + + _sortedSystems.Sort(scope (a, b) => + { + return a.Section - b.Section; + }); + + for (var i in _registeredLooseSystems) + _sortedLooseSystems.Add(i.value); + + _sortedLooseSystems.Sort(scope (a, b) => + { + return a.2 - b.2; + }); + } + } \ No newline at end of file diff --git a/src/System.bf b/src/System.bf index a75babb..7e8bcf7 100644 --- a/src/System.bf +++ b/src/System.bf @@ -1,4 +1,5 @@ namespace Theater_ECS; +using Theater_ECS.Internal; using Theater_ECS.Internal.Containers; using System; @@ -8,6 +9,7 @@ abstract class System { public bool Paused = false; //Wether or not this service should be run public float RuntimeDelay = 0; //How many seconds should we wait after running this system + public SystemSection Section = .TECS_Update; private List _Components = new .(10) ~ delete _; From bc8926725adbc3b284b77efd59b2b200923411fb Mon Sep 17 00:00:00 2001 From: Booklordofthedings Date: Tue, 19 Nov 2024 19:48:52 +0100 Subject: [PATCH 12/17] More system sorting and making the api slightly faster --- src/Internal/Managers/SystemsManager.bf | 30 +++++++ src/System.bf | 108 ++++++++++++------------ 2 files changed, 84 insertions(+), 54 deletions(-) diff --git a/src/Internal/Managers/SystemsManager.bf b/src/Internal/Managers/SystemsManager.bf index d9522ea..a4fed45 100644 --- a/src/Internal/Managers/SystemsManager.bf +++ b/src/Internal/Managers/SystemsManager.bf @@ -93,6 +93,36 @@ class SystemsManager : IEnumerable<(String key, System value)> } } + ///Run all systems that fall inbetween two Sections + public void RunSystemsBetween(ECS ecs, SystemSection sectionStart, SystemSection sectionEnd, float delta = 0) + { + if (_dirty) + { + SortSystemPriorites(); + _dirty = false; + } + + int counter = 0; + int counterLoose = 0; + + for (uint8 section = (.)sectionStart; section <= (uint8)sectionEnd; section++) + { + if (_sortedSystems.Count > counter) + while (_sortedSystems[counter].Section == (.)section) + { + _sortedSystems[counter].RunSystem(ecs); + counter++; + } + + if (_sortedLooseSystems.Count > counterLoose) + while (_sortedLooseSystems[counterLoose].2 == (.)section) + { + _sortedLooseSystems[counterLoose].0(ecs); + counter++; + } + } + } + ///Run all systems with a specific section public void RunSystemsBySection(ECS ecs, SystemSection section, float delta = 0) { diff --git a/src/System.bf b/src/System.bf index 7e8bcf7..2c6a7e6 100644 --- a/src/System.bf +++ b/src/System.bf @@ -20,15 +20,15 @@ abstract class System public abstract void RegisterSystem(ECS ecs); ///Yes surely this is a good idea - public virtual void Run(void* p1) { }; - public virtual void Run(void* p1, void* p2) { }; - public virtual void Run(void* p1, void* p2, void* p3) { }; - public virtual void Run(void* p1, void* p2, void* p3, void* p4) { }; - public virtual void Run(void* p1, void* p2, void* p3, void* p4, void* p5) { }; - public virtual void Run(void* p1, void* p2, void* p3, void* p4, void* p5, void* p6) { }; - public virtual void Run(void* p1, void* p2, void* p3, void* p4, void* p5, void* p6, void* p7) { }; - public virtual void Run(void* p1, void* p2, void* p3, void* p4, void* p5, void* p6, void* p7, void* p8) { }; - public virtual void Run(void* p1, void* p2, void* p3, void* p4, void* p5, void* p6, void* p7, void* p8, void* p9) { }; + public function void(void* p1) Run_1;; + public function void(void* p1, void* p2) Run_2; + public function void(void* p1, void* p2, void* p3) Run_3; + public function void(void* p1, void* p2, void* p3, void* p4) Run_4; + public function void(void* p1, void* p2, void* p3, void* p4, void* p5) Run_5; + public function void(void* p1, void* p2, void* p3, void* p4, void* p5, void* p6) Run_6; + public function void(void* p1, void* p2, void* p3, void* p4, void* p5, void* p6, void* p7) Run_7; + public function void(void* p1, void* p2, void* p3, void* p4, void* p5, void* p6, void* p7, void* p8) Run_8; + public function void(void* p1, void* p2, void* p3, void* p4, void* p5, void* p6, void* p7, void* p8, void* p9) Run_9; public void RunSystem(ECS ecs) { @@ -52,147 +52,147 @@ abstract class System { case 1: for (int ii < cun) - this.Run(main[(.)entities[ii].Index]); + this.Run_1(main[(.)entities[ii].Index]); case 2: if (comp == _Components[0]) for (int ii < cun) - this.Run(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1])); + this.Run_2(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1])); else for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index]); + this.Run_2(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index]); case 3: if (comp == _Components[0]) for (int ii < cun) - this.Run(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2])); + this.Run_3(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2])); else if (comp == _Components[1]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2])); + this.Run_3(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2])); else for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index]); + this.Run_3(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index]); case 4: if (comp == _Components[0]) for (int ii < cun) - this.Run(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3])); + this.Run_4(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3])); else if (comp == _Components[1]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[2])); + this.Run_4(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[2])); else if (comp == _Components[2]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2])); + this.Run_4(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2])); else for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), main[(.)entities[ii].Index]); + this.Run_4(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), main[(.)entities[ii].Index]); case 5: if (comp == _Components[0]) for (int ii < cun) - this.Run(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4])); + this.Run_5(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4])); else if (comp == _Components[1]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4])); + this.Run_5(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4])); else if (comp == _Components[2]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4])); + this.Run_5(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4])); else if (comp == _Components[3]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[4])); + this.Run_5(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[4])); else for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), main[(.)entities[ii].Index]); + this.Run_5(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), main[(.)entities[ii].Index]); case 6: if (comp == _Components[0]) for (int ii < cun) - this.Run(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5])); + this.Run_6(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5])); else if (comp == _Components[1]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5])); + this.Run_6(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5])); else if (comp == _Components[2]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5])); + this.Run_6(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5])); else if (comp == _Components[3]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5])); + this.Run_6(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5])); else if (comp == _Components[4]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[5])); + this.Run_6(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[5])); else for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), main[(.)entities[ii].Index]); + this.Run_6(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), main[(.)entities[ii].Index]); case 7: if (comp == _Components[0]) for (int ii < cun) - this.Run(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6])); + this.Run_7(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6])); else if (comp == _Components[1]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6])); + this.Run_7(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6])); else if (comp == _Components[2]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6])); + this.Run_7(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6])); else if (comp == _Components[3]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6])); + this.Run_7(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6])); else if (comp == _Components[4]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6])); + this.Run_7(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6])); else if (comp == _Components[5]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[6])); + this.Run_7(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[6])); else for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), main[(.)entities[ii].Index]); + this.Run_7(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), main[(.)entities[ii].Index]); case 8: if (comp == _Components[0]) for (int ii < cun) - this.Run(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7])); + this.Run_8(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7])); else if (comp == _Components[1]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7])); + this.Run_8(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7])); else if (comp == _Components[2]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7])); + this.Run_8(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7])); else if (comp == _Components[3]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7])); + this.Run_8(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7])); else if (comp == _Components[4]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7])); + this.Run_8(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7])); else if (comp == _Components[5]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[7])); + this.Run_8(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[7])); else if (comp == _Components[6]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[7])); + this.Run_8(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[7])); else for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), main[(.)entities[ii].Index]); + this.Run_8(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), main[(.)entities[ii].Index]); case 9: if (comp == _Components[0]) for (int ii < cun) - this.Run(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); + this.Run_9(main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); else if (comp == _Components[1]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); + this.Run_9(ecs.Components.GetData(entities[ii], _Components[0]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); else if (comp == _Components[2]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); + this.Run_9(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); else if (comp == _Components[3]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); + this.Run_9(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); else if (comp == _Components[4]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); + this.Run_9(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); else if (comp == _Components[5]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); + this.Run_9(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); else if (comp == _Components[6]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); + this.Run_9(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[7]), ecs.Components.GetData(entities[ii], _Components[8])); else if (comp == _Components[7]) for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[8])); + this.Run_9(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), main[(.)entities[ii].Index], ecs.Components.GetData(entities[ii], _Components[8])); else for (int ii < cun) - this.Run(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[8]), main[(.)entities[ii].Index]); + this.Run_9(ecs.Components.GetData(entities[ii], _Components[0]), ecs.Components.GetData(entities[ii], _Components[1]), ecs.Components.GetData(entities[ii], _Components[2]), ecs.Components.GetData(entities[ii], _Components[3]), ecs.Components.GetData(entities[ii], _Components[4]), ecs.Components.GetData(entities[ii], _Components[5]), ecs.Components.GetData(entities[ii], _Components[6]), ecs.Components.GetData(entities[ii], _Components[8]), main[(.)entities[ii].Index]); } } #endregion From 40d50bbda9c20fbe164bf7d4918cbd6a47accf79 Mon Sep 17 00:00:00 2001 From: Booklordofthedings Date: Tue, 19 Nov 2024 21:11:12 +0100 Subject: [PATCH 13/17] bugfix --- src/Internal/Managers/EntityManager.bf | 3 ++- src/System.bf | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Internal/Managers/EntityManager.bf b/src/Internal/Managers/EntityManager.bf index aeaa6e7..d36894d 100644 --- a/src/Internal/Managers/EntityManager.bf +++ b/src/Internal/Managers/EntityManager.bf @@ -24,7 +24,8 @@ class EntityManager if(_entities.Count + 1 > Entity.IndexMask) return .Null; //It would be beneficial if we could avoid this check #endif - return .((.)_entities..Add(.((.)_entities.Count, 0)).Count, 0); + _entities.Add(Entity((.)_entities.Count,0)); + return _entities.Back; } else { diff --git a/src/System.bf b/src/System.bf index 2c6a7e6..65ca85d 100644 --- a/src/System.bf +++ b/src/System.bf @@ -45,7 +45,7 @@ abstract class System //We now have the list of entities to loop through Span entities = ecs.Components.Components[comp].GetAll(); UList main = ecs.Components.Components[comp].[Friend]_packedEntities; - var cun = entities.Length - 1; + var cun = entities.Length; #region DumbStatement switch (_Components.Count) From 27a682906dc6c23fe4d46600c30f92315dcbbf72 Mon Sep 17 00:00:00 2001 From: Booklordofthedings Date: Wed, 20 Nov 2024 16:30:41 +0100 Subject: [PATCH 14/17] added actual beef proj file --- BeefProj.toml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 BeefProj.toml diff --git a/BeefProj.toml b/BeefProj.toml new file mode 100644 index 0000000..af69b29 --- /dev/null +++ b/BeefProj.toml @@ -0,0 +1,6 @@ +FileVersion = 1 + +[Project] +Name = "Theater-ECS" +TargetType = "BeefLib" +StartupObject = "Theater_ECS.Program" From 6fd444feec8bbebebd96e1de71cf162affb2f5a0 Mon Sep 17 00:00:00 2001 From: Booklordofthedings Date: Thu, 21 Nov 2024 16:59:33 +0100 Subject: [PATCH 15/17] Update README.md --- README.md | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6205cc6..fb1985d 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,19 @@ -# Theater-ECS +### **Theater-ECS** -An ecs to be used in the TE enviroment \ No newline at end of file +is a library which implements the *entity, component, system* pattern. +It is intended to be used for game development in the "Theater Engine" ecosystem, +however it may also be used for other things. + +### Design goals +- Dynamic + *Lots of ECS libraries use compile time code generation for performance benefits. + Theater-ECS is intended to be fully dynamic so that components and system could be created and registered at runtime* +- Fast + *Theater-ECS should be fast enough for most game projects, while handling a high amount of entities and components* +- Use what you need + *The amount of memory used by Theater-ECS is minimized so that it mostly only uses which memory you are actually using and doesnt + allocate any large unused buffers.* + +### Further information +- [Wiki](https://code.booklordofthe.dev/Theater/Theater-ECS/wiki) +- [Example Project](https://code.booklordofthe.dev/Theater/Theater-ECS-Example) \ No newline at end of file From befaf61310aba32b34111a7c649de43e8c50f3cb Mon Sep 17 00:00:00 2001 From: Booklordofthedings Date: Fri, 22 Nov 2024 10:09:22 +0100 Subject: [PATCH 16/17] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index fb1985d..3a06ac5 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,12 @@ however it may also be used for other things. *The amount of memory used by Theater-ECS is minimized so that it mostly only uses which memory you are actually using and doesnt allocate any large unused buffers.* +### Installation + +No dependencies are required, so you can simply clone this library and add it as a dependency to your +Beef project. +BeefProj.toml: `Dependencies = {Theater-ECS = "*"}` + ### Further information - [Wiki](https://code.booklordofthe.dev/Theater/Theater-ECS/wiki) - [Example Project](https://code.booklordofthe.dev/Theater/Theater-ECS-Example) \ No newline at end of file From 210be7f15f24d68168cdf0a7a963895cbf668358 Mon Sep 17 00:00:00 2001 From: Booklordofthedings Date: Fri, 22 Nov 2024 10:10:05 +0100 Subject: [PATCH 17/17] Fix wrong merge --- src/ComponentManager.bf | 109 -------------------------------- src/ECS.bf | 5 -- src/Example/MoverSystem.bf | 13 ---- src/Example/Position.bf | 9 --- src/Example/Program.bf | 62 ------------------- src/Example/Velocity.bf | 9 --- src/SystemMethodAttribute.bf | 117 ----------------------------------- 7 files changed, 324 deletions(-) delete mode 100644 src/ComponentManager.bf delete mode 100644 src/Example/MoverSystem.bf delete mode 100644 src/Example/Position.bf delete mode 100644 src/Example/Program.bf delete mode 100644 src/Example/Velocity.bf delete mode 100644 src/SystemMethodAttribute.bf diff --git a/src/ComponentManager.bf b/src/ComponentManager.bf deleted file mode 100644 index 8fe5778..0000000 --- a/src/ComponentManager.bf +++ /dev/null @@ -1,109 +0,0 @@ -namespace Theater_ECS; - -using System; -using System.Threading; -using System.Collections; - -class ComponentManager -{ - private Monitor _Lock = new .() ~ delete _; - - private int_cosize _ComponentSize = -1; - private readonly int _IndexSize = sizeof(int_cosize); - - private int_cosize _Next = 0; - private List _Data = null ~ delete _; - private List _Available = new .() ~ delete _; - private HashSet _Deleted = new .() ~ delete _; - - ///Make the component manager useable for a specific type of component - public void Initialize(int_cosize count) where T : struct - { - _ComponentSize = sizeof(T); - _Data = new .( //So that we dont have to realloc as frequently - (_IndexSize + _ComponentSize) * count - ); - } - - ///Creates space for a new component instance and returns a pointer to it - public (Component, void*) Create(Entity owner) - { - if (_Available.Count > 0) - { - var idx = _Available.PopFront(); - _Deleted.Remove(idx); - - *(int_cosize*)(void*)&_Data[idx * (_ComponentSize + _IndexSize)] = owner; - void* toReturn = (void*)&_Data[idx * (_ComponentSize + _IndexSize) + _IndexSize]; - return ( - idx, - toReturn - ); - } - else - { - Grow(); - *(int_cosize*)(void*)(_Data.Ptr + (_Next * (_ComponentSize + _IndexSize))) = owner; - //This calculates to the next biggest position + the offset of the index - void* toReturn = (void*)(_Data.Ptr + (_Next * (_ComponentSize + _IndexSize) + _IndexSize)); - return ( - _Next++, - toReturn - ); - } - } - - ///Remove an entry, and returns a pointer to the removed object, if you want to - public Result Remove(int_cosize idx) - { - if (idx >= _Next || _Deleted.Contains(idx)) - return .Err; - - *(int_cosize*)(void*)&_Data[idx * (_ComponentSize + _IndexSize)] = -1; - - _Deleted.Add(idx); - - return .Ok( - (void*)(_Data.Ptr + idx * (_ComponentSize + _IndexSize) + _IndexSize) - ); - } - - public int_cosize Count - { - get - { - return (.)(_Data.Count / (_ComponentSize + _IndexSize)); - } - } - - - public Span<(Entity, T)> GetAll() where T : struct - { - return .((.)(void*)_Data.Ptr, Count); - } - - [Unchecked] - public T* Get(int_cosize idx) where T : struct - { - return (T*)(void*)(_Data.Ptr + idx * (_ComponentSize + _IndexSize) + _IndexSize); - } - - [Unchecked] - public void GetEntities(List list) - { - var ec = (_Data.Count / (_ComponentSize + _IndexSize)); - list.GrowUninitialized(ec); - for (int i < ec) - *(list.Ptr + (i)) = *(Entity*)(void*)(_Data.Ptr +i * (_ComponentSize + _IndexSize)); - } - - public void Use() => _Lock.Enter(); - public void StopUsing() => _Lock.Exit(); - - - public void Grow(int_cosize amount = 1) - { //Make more size useable - _Data.GrowUninitialized((_ComponentSize + _IndexSize) * amount); - } - -} \ No newline at end of file diff --git a/src/ECS.bf b/src/ECS.bf index 370b889..91dbc5a 100644 --- a/src/ECS.bf +++ b/src/ECS.bf @@ -1,11 +1,6 @@ namespace Theater_ECS; using Theater_ECS.Internal.Managers; - -public typealias Entity = int_cosize; - -public typealias Component = int_cosize; - class ECS { public SystemsManager Systems = new .(this) ~ delete _; diff --git a/src/Example/MoverSystem.bf b/src/Example/MoverSystem.bf deleted file mode 100644 index e02cec7..0000000 --- a/src/Example/MoverSystem.bf +++ /dev/null @@ -1,13 +0,0 @@ -namespace Theater_ECS.Example; - - -class MoverSystem : System -{ - - [SystemMethod("MoveItems", typeof(Velocity), typeof(Position))] - public void MoveItems(ref Velocity v,ref Position p) - { - //p.x = v.x + p.x; - //p.y = v.y = p.y; - } -} \ No newline at end of file diff --git a/src/Example/Position.bf b/src/Example/Position.bf deleted file mode 100644 index 1157b34..0000000 --- a/src/Example/Position.bf +++ /dev/null @@ -1,9 +0,0 @@ -namespace Theater_ECS.Example; - -using System; - -struct Position -{ - public float x = (.)gRand.NextI32() % 25; - public float y = (.)gRand.NextI32() % 25; -} \ No newline at end of file diff --git a/src/Example/Program.bf b/src/Example/Program.bf deleted file mode 100644 index 1c78700..0000000 --- a/src/Example/Program.bf +++ /dev/null @@ -1,62 +0,0 @@ -namespace Theater_ECS; -using Theater_ECS.Example; - - -using System; -using System.Collections; - -class Program -{ - public static uint64 counter = 0; - - public static void Main() - { - ECS ecs = scope .(); - var pos = ecs.RegisterComponent(100); - //var waste = ecs.RegisterComponent(100); - var vel = ecs.RegisterComponent(100); - - - List entities = scope .(); - for(int i < 500000) - entities.Add(ecs.CreateEntity()); - - for(var i in entities) - *(Position*)ecs.AddComponentToEntity(i, pos).Value = .(); - - for(var i in entities) - *(Velocity*)ecs.AddComponentToEntity(i, vel).Value = .(); - - /* - for(var i in entities) - if(gRand.NextI32() % 2 == 1) - *(waste*)ecs.AddComponentToEntity(i, waste).Value = .(); - */ - - MoverSystem s = scope .(); - s.IntializeSystem(ecs); - - System.Diagnostics.Stopwatch watch = scope .(); - for(int a < 10) - { - watch.Start(); - for(int i < 10) - { - - s.RunSystem(ecs); - - } - Console.WriteLine(scope $"{watch.ElapsedMilliseconds}ms"); - watch.Stop(); - watch.Reset(); - } - //Console.Read(); - } - - -} - -public struct waste -{ - private float[10] a; -} \ No newline at end of file diff --git a/src/Example/Velocity.bf b/src/Example/Velocity.bf deleted file mode 100644 index 8067be8..0000000 --- a/src/Example/Velocity.bf +++ /dev/null @@ -1,9 +0,0 @@ -namespace Theater_ECS.Example; - -using System; - -struct Velocity -{ - public float x = (.)gRand.NextI32() % 25; - public float y = (.)gRand.NextI32() % 25; -} \ No newline at end of file diff --git a/src/SystemMethodAttribute.bf b/src/SystemMethodAttribute.bf deleted file mode 100644 index 1541cea..0000000 --- a/src/SystemMethodAttribute.bf +++ /dev/null @@ -1,117 +0,0 @@ -namespace Theater_ECS; - -using System; -using System.Reflection; -using System.Collections; - -[AttributeUsage(.Method)] -struct SystemMethodAttribute : Attribute, IOnTypeInit -{ - private StringView _Name; - private Span _Types; - - public this(StringView name, params Span types) - { - _Name = name; - _Types = types; - } - - [Comptime] - public void OnTypeInit(Type type, Self* prev) - { - //InitializeFunction - Compiler.EmitTypeBody(type, scope $""" - public override bool IntializeSystem(ECS ecs) - \{ - {InitializeSystemTypes( .. scope .())} - return true; - \} - - """); - - - Compiler.EmitTypeBody(type, scope $""" - [System.DisableChecks] - public override void RunSystem(ECS ecs) - \{ - Lock(ecs); - - Component lowest = System.int_cosize.MaxValue; - System.int_cosize lowestAmount = System.int_cosize.MaxValue; - for(var c in _ComponentMap) - \{ - if(ecs.[System.Friend]_ComponentsPacked[c.value].Count < lowestAmount) - \{ - lowest = c.value; - lowestAmount = ecs.[System.Friend]_ComponentsPacked[c.value].Count; - \} - \} - - - ecs.GetEntityFromComponent(lowest, _Target); - - {CacheComponentData(.. scope .())} - - - for(var e in _Target) - \{ - - {_Name}( - {GetComponentData(.. scope .())} - ); - \} - - _Target.Clear(); - - Unlock(ecs); - - \} - - private void Lock(ECS ecs) - \{ - for(var i in _ComponentMap) - ecs.[System.Friend]_ComponentsPacked[i.value].Use(); - \} - - private void Unlock(ECS ecs) - \{ - for(var i in _ComponentMap) - ecs.[System.Friend]_ComponentsPacked[i.value].StopUsing(); - \} - """); - } - - private void InitializeSystemTypes(String buffer) - { - for(var i in _Types) - { - buffer.Append(scope $""" - if(ecs.GetComponent<{i.GetName( .. scope .())}>() == -1) - return false; - _ComponentMap.Add(typeof({i.GetName(.. scope .())}), ecs.GetComponent<{i.GetName( .. scope .())}>()); - - - """); - } - } - - private void GetComponentData(String buffer) - { - for(var i in _Types) - { - buffer.Append(scope $""" - ref *ecs.[System.Friend]_ComponentsPacked[_{i.GetName(.. scope .())}].Get<{i.GetName(.. scope .())}>(ecs.[System.Friend]_EntityList[_{i.GetName(.. scope .())}][e]) - """); - if(@i.Index+1 < _Types.Length) - buffer.Append(",\n"); - } - } - - private void CacheComponentData(String buffer) - { - for(var i in _Types) - { - buffer.Append(scope $"Component _{i.GetName(.. scope .())} = _ComponentMap[typeof({i.GetName(.. scope .())})];\n"); - } - } -} \ No newline at end of file