From 29749f64e95a7f0133771713b33debaae1259e9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Sat, 11 Sep 2021 16:31:16 +0200 Subject: [PATCH] Added WorldEnumerator with 4 generic parameters --- GlitchyEngine/src/World/EcsWorld.bf | 6 ++++ GlitchyEngine/src/World/WorldEnumerator.bf | 33 ++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/GlitchyEngine/src/World/EcsWorld.bf b/GlitchyEngine/src/World/EcsWorld.bf index 915b390..6732da8 100644 --- a/GlitchyEngine/src/World/EcsWorld.bf +++ b/GlitchyEngine/src/World/EcsWorld.bf @@ -257,6 +257,12 @@ namespace GlitchyEngine.World return WorldEnumerator(this); } + public WorldEnumerator Enumerate() + where TComponent0 : struct where TComponent1 : struct where TComponent2 : struct where TComponent3 : struct + { + return WorldEnumerator(this); + } + public static void Test() { EcsWorld world = new .(); diff --git a/GlitchyEngine/src/World/WorldEnumerator.bf b/GlitchyEngine/src/World/WorldEnumerator.bf index 60611bb..23845e1 100644 --- a/GlitchyEngine/src/World/WorldEnumerator.bf +++ b/GlitchyEngine/src/World/WorldEnumerator.bf @@ -134,4 +134,37 @@ namespace GlitchyEngine.World return .Ok((entity.Value, component0, component1, component2)); } } + + public struct WorldEnumerator : WorldEnumerator, + IEnumerator<(Entity Entity, TComponent0* Component0, TComponent1* Component1, TComponent2* Component2, TComponent3* Component3)> + where TComponent0 : struct where TComponent1 : struct where TComponent2 : struct where TComponent3 : struct + { + internal EcsWorld.ComponentPoolEntry* _componentPool0; + internal EcsWorld.ComponentPoolEntry* _componentPool1; + internal EcsWorld.ComponentPoolEntry* _componentPool2; + internal EcsWorld.ComponentPoolEntry* _componentPool3; + + public this(EcsWorld world) : base(world, scope Type[](typeof(TComponent0), typeof(TComponent1), typeof(TComponent2), typeof(TComponent3))) + { + _componentPool0 = &world.GetComponentPool(); + _componentPool1 = &world.GetComponentPool(); + _componentPool2 = &world.GetComponentPool(); + _componentPool3 = &world.GetComponentPool(); + } + + public new Result<(Entity Entity, TComponent0* Component0, TComponent1* Component1, TComponent2* Component2, TComponent3* Component3)> GetNext() mut + { + Result entity = base.GetNext(); + + if(entity case .Err) + return .Err; + + TComponent0* component0 = (.)_componentPool0.Pool.Get(entity.Value.Index); + TComponent1* component1 = (.)_componentPool1.Pool.Get(entity.Value.Index); + TComponent2* component2 = (.)_componentPool2.Pool.Get(entity.Value.Index); + TComponent3* component3 = (.)_componentPool3.Pool.Get(entity.Value.Index); + + return .Ok((entity.Value, component0, component1, component2, component3)); + } + } }