diff --git a/src/Builtin/BaseRunners.cs b/src/Builtin/BaseProcesses.cs similarity index 100% rename from src/Builtin/BaseRunners.cs rename to src/Builtin/BaseProcesses.cs diff --git a/src/Builtin/InjectSystem.cs b/src/Builtin/InjectSystem.cs index b4f9151..856670b 100644 --- a/src/Builtin/InjectSystem.cs +++ b/src/Builtin/InjectSystem.cs @@ -1,5 +1,6 @@ using DCFApixels.DragonECS.Internal; using DCFApixels.DragonECS.RunnersCore; +using System; using System.Linq; namespace DCFApixels.DragonECS @@ -54,17 +55,38 @@ namespace DCFApixels.DragonECS [DebugHide, DebugColor(DebugColor.Gray)] public sealed class EcsInjectRunner : EcsRunner>, IEcsInject { - private IEcsPreInject _preInjectchache; + private EcsBaseTypeInjectRunner _baseTypeInjectRunner; void IEcsInject.Inject(T obj) { - _preInjectchache.PreInject(obj); + _baseTypeInjectRunner.Inject(obj); foreach (var item in targets) item.Inject(obj); } protected override void OnSetup() { - _preInjectchache = Source.GetRunner(); + Type baseType = typeof(T).BaseType; + if (baseType != typeof(object) && baseType != typeof(ValueType) && baseType != null) + _baseTypeInjectRunner = (EcsBaseTypeInjectRunner)Activator.CreateInstance(typeof(EcsBaseTypeInjectRunner<>).MakeGenericType(baseType), Source); + else + _baseTypeInjectRunner = new EcsObjectTypePreInjectRunner(Source); } } + internal abstract class EcsBaseTypeInjectRunner + { + public abstract void Inject(object obj); + } + internal class EcsBaseTypeInjectRunner : EcsBaseTypeInjectRunner + { + private IEcsInject _runner; + public EcsBaseTypeInjectRunner(EcsPipeline pipeline) => _runner = pipeline.GetRunner>(); + public override void Inject(object obj) => _runner.Inject((T)obj); + } + internal class EcsObjectTypePreInjectRunner : EcsBaseTypeInjectRunner + { + private IEcsPreInject _runner; + public EcsObjectTypePreInjectRunner(EcsPipeline pipeline) => _runner = pipeline.GetRunner(); + public override void Inject(object obj) => _runner.PreInject(obj); + } + [DebugHide, DebugColor(DebugColor.Gray)] public sealed class EcsPreInitInjectProcessRunner : EcsRunner, IEcsPreInitInjectProcess { diff --git a/src/Builtin/Systems.cs b/src/Builtin/Systems.cs index 612cbfc..c4eab58 100644 --- a/src/Builtin/Systems.cs +++ b/src/Builtin/Systems.cs @@ -1,5 +1,5 @@ -using System.Collections.Generic; -using DCFApixels.DragonECS.Internal; +using DCFApixels.DragonECS.Internal; +using System.Collections.Generic; namespace DCFApixels.DragonECS { @@ -12,14 +12,10 @@ namespace DCFApixels.DragonECS public SystemsLayerMarkerSystem(string name) => this.name = name; } [DebugHide, DebugColor(DebugColor.Grey)] - public class DeleteEmptyEntitesSystem : IEcsRunProcess, IEcsPreInject + public class DeleteEmptyEntitesSystem : IEcsRunProcess, IEcsInject { private List _worlds = new List(); - public void PreInject(object obj) - { - if (obj is EcsWorld world) - _worlds.Add(world); - } + public void Inject(EcsWorld obj) => _worlds.Add(obj); public void Run(EcsPipeline pipeline) { foreach (var world in _worlds) @@ -27,7 +23,7 @@ namespace DCFApixels.DragonECS } } [DebugHide, DebugColor(DebugColor.Grey)] - public class DeleteOneFrameComponentSystem : IEcsRunProcess, IEcsPreInject + public class DeleteOneFrameComponentSystem : IEcsRunProcess, IEcsInject where TComponent : struct, IEcsComponent { private sealed class Subject : EcsSubject @@ -36,11 +32,7 @@ namespace DCFApixels.DragonECS public Subject(Builder b) => pool = b.Include(); } List _worlds = new List(); - public void PreInject(object obj) - { - if (obj is EcsWorld world) - _worlds.Add(world); - } + public void Inject(EcsWorld obj) => _worlds.Add(obj); public void Run(EcsPipeline pipeline) { for (int i = 0, iMax = _worlds.Count; i < iMax; i++)