DragonECS/src/Builtin/InjectSystem.cs

165 lines
5.1 KiB
C#
Raw Normal View History

2023-03-29 15:48:37 +08:00
using DCFApixels.DragonECS.Internal;
2023-03-29 06:19:24 +08:00
using System.Linq;
namespace DCFApixels.DragonECS
{
2023-03-29 06:19:24 +08:00
namespace Internal
{
2023-03-29 15:48:37 +08:00
internal class PreInitInjectController
2023-03-29 06:19:24 +08:00
{
2023-03-30 05:32:43 +08:00
private EcsPipeline _source;
2023-03-29 06:19:24 +08:00
private InjectSystemBase[] _injectSystems;
private int _injectCount;
2023-03-30 05:32:43 +08:00
public PreInitInjectController(EcsPipeline source)
2023-03-29 06:19:24 +08:00
{
_injectCount = 0;
_source = source;
_injectSystems = _source.AllSystems.OfType<InjectSystemBase>().ToArray();
}
public bool OnInject()
{
_injectCount++;
return IsInjectionEnd;
}
public bool IsInjectionEnd => _injectSystems.Length <= _injectCount;
public void Destroy()
{
_source = null;
_injectSystems = null;
}
}
}
2023-03-29 15:48:37 +08:00
public interface IEcsPreInject : IEcsSystem
2023-03-29 06:19:24 +08:00
{
2023-03-29 15:48:37 +08:00
public void PreInject(object obj);
2023-03-29 06:19:24 +08:00
}
2023-03-29 15:48:37 +08:00
[DebugHide, DebugColor(DebugColor.Gray)]
public sealed class PreInjectRunner : EcsRunner<IEcsPreInject>, IEcsPreInject
2023-03-29 06:19:24 +08:00
{
2023-03-29 15:48:37 +08:00
void IEcsPreInject.PreInject(object obj)
2023-03-29 06:19:24 +08:00
{
2023-03-29 15:48:37 +08:00
foreach (var item in targets) item.PreInject(obj);
2023-03-29 06:19:24 +08:00
}
}
2023-03-12 20:45:18 +08:00
public interface IEcsInject<T> : IEcsSystem
2023-03-12 01:33:48 +08:00
{
public void Inject(T obj);
}
2023-03-29 15:48:37 +08:00
[DebugHide, DebugColor(DebugColor.Gray)]
2023-03-12 02:48:51 +08:00
public sealed class InjectRunner<T> : EcsRunner<IEcsInject<T>>, IEcsInject<T>
{
2023-03-29 15:48:37 +08:00
private IEcsPreInject _preInjectchache;
2023-03-12 02:02:39 +08:00
void IEcsInject<T>.Inject(T obj)
{
2023-03-29 15:48:37 +08:00
_preInjectchache.PreInject(obj);
2023-03-29 06:19:24 +08:00
foreach (var item in targets) item.Inject(obj);
}
2023-03-29 15:48:37 +08:00
protected override void OnSetup()
2023-03-29 06:19:24 +08:00
{
2023-03-29 15:48:37 +08:00
_preInjectchache = Source.GetRunner<IEcsPreInject>();
2023-03-29 06:19:24 +08:00
}
}
2023-03-29 15:48:37 +08:00
public interface IEcsPreInitInjectCallbacks : IEcsSystem
2023-03-29 06:19:24 +08:00
{
2023-03-29 15:48:37 +08:00
public void OnPreInitInjectionBefore();
public void OnPreInitInjectionAfter();
}
2023-03-29 06:19:24 +08:00
2023-03-29 15:48:37 +08:00
[DebugHide, DebugColor(DebugColor.Gray)]
public sealed class InjectCallbacksRunner : EcsRunner<IEcsPreInitInjectCallbacks>, IEcsPreInitInjectCallbacks
{
public void OnPreInitInjectionAfter()
2023-03-29 06:19:24 +08:00
{
2023-03-29 15:48:37 +08:00
foreach (var item in targets) item.OnPreInitInjectionAfter();
2023-03-29 06:19:24 +08:00
}
2023-03-29 15:48:37 +08:00
public void OnPreInitInjectionBefore()
2023-03-29 06:19:24 +08:00
{
2023-03-29 15:48:37 +08:00
foreach (var item in targets) item.OnPreInitInjectionBefore();
2023-03-12 02:02:39 +08:00
}
}
2023-03-12 01:33:48 +08:00
2023-03-29 15:48:37 +08:00
public class InjectSystemBase { }
[DebugHide, DebugColor(DebugColor.Gray)]
public class InjectSystem<T> : InjectSystemBase, IEcsPreInitSystem, IEcsInject<PreInitInjectController>, IEcsPreInitInjectCallbacks
2023-03-12 02:02:39 +08:00
{
private T _injectedData;
2023-03-29 15:48:37 +08:00
private PreInitInjectController _injectController;
void IEcsInject<PreInitInjectController>.Inject(PreInitInjectController obj) => _injectController = obj;
2023-03-29 06:19:24 +08:00
2023-03-16 01:49:14 +08:00
public InjectSystem(T injectedData)
{
_injectedData = injectedData;
}
2023-03-30 05:32:43 +08:00
public void PreInit(EcsPipeline pipeline)
{
2023-03-29 06:19:24 +08:00
2023-03-29 15:48:37 +08:00
if (_injectController == null)
{
2023-03-30 05:32:43 +08:00
_injectController = new PreInitInjectController(pipeline);
var injectMapRunner = pipeline.GetRunner<IEcsInject<PreInitInjectController>>();
pipeline.GetRunner<IEcsPreInitInjectCallbacks>().OnPreInitInjectionBefore();
2023-03-29 06:19:24 +08:00
injectMapRunner.Inject(_injectController);
}
2023-03-30 05:32:43 +08:00
var injectRunnerGeneric = pipeline.GetRunner<IEcsInject<T>>();
2023-03-29 06:19:24 +08:00
injectRunnerGeneric.Inject(_injectedData);
if (_injectController.OnInject())
{
_injectController.Destroy();
2023-03-30 05:32:43 +08:00
var injectCallbacksRunner = pipeline.GetRunner<IEcsPreInitInjectCallbacks>();
2023-03-29 15:48:37 +08:00
injectCallbacksRunner.OnPreInitInjectionAfter();
2023-03-30 05:32:43 +08:00
EcsRunner.Destroy(injectCallbacksRunner);
2023-03-29 06:19:24 +08:00
}
}
2023-03-29 15:48:37 +08:00
public void OnPreInitInjectionBefore() { }
2023-03-29 06:19:24 +08:00
2023-03-29 15:48:37 +08:00
public void OnPreInitInjectionAfter()
2023-03-29 06:19:24 +08:00
{
_injectController = null;
}
}
2023-03-16 01:49:14 +08:00
public static class InjectSystemExstensions
{
2023-03-30 05:32:43 +08:00
public static EcsPipeline.Builder Inject<T>(this EcsPipeline.Builder self, T data)
{
2023-03-16 01:49:14 +08:00
self.Add(new InjectSystem<T>(data));
return self;
}
2023-03-30 05:32:43 +08:00
public static EcsPipeline.Builder Inject<A, B>(this EcsPipeline.Builder self, A a, B b)
{
2023-03-26 11:19:03 +08:00
self.Inject(a).Inject(b);
return self;
}
2023-03-30 05:32:43 +08:00
public static EcsPipeline.Builder Inject<A, B, C, D>(this EcsPipeline.Builder self, A a, B b, C c, D d)
{
2023-03-26 11:19:03 +08:00
self.Inject(a).Inject(b).Inject(c).Inject(d);
return self;
}
2023-03-30 05:32:43 +08:00
public static EcsPipeline.Builder Inject<A, B, C, D, E>(this EcsPipeline.Builder self, A a, B b, C c, D d, E e)
2023-03-26 11:19:03 +08:00
{
self.Inject(a).Inject(b).Inject(c).Inject(d).Inject(e);
return self;
}
2023-03-30 05:32:43 +08:00
public static EcsPipeline.Builder Inject<A, B, C, D, E, F>(this EcsPipeline.Builder self, A a, B b, C c, D d, E e, F f)
{
2023-03-26 11:19:03 +08:00
self.Inject(a).Inject(b).Inject(c).Inject(d).Inject(e).Inject(f);
return self;
}
}
}