namespace Theater_ECS; using Theater_ECS.Containers; using Theater_ECS.Example; using System; using System.Collections; 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 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; } }