2023-03-29 15:48:37 +08:00
|
|
|
|
using DCFApixels.DragonECS.Internal;
|
2023-04-23 17:55:01 +08:00
|
|
|
|
using DCFApixels.DragonECS.RunnersCore;
|
2023-05-30 01:31:04 +08:00
|
|
|
|
using System;
|
2023-03-29 06:19:24 +08:00
|
|
|
|
using System.Linq;
|
|
|
|
|
|
|
|
|
|
namespace DCFApixels.DragonECS
|
2023-02-13 21:11:54 +08:00
|
|
|
|
{
|
2023-05-30 18:27:30 +08:00
|
|
|
|
public interface IEcsPreInject : IEcsProcess
|
2023-05-26 03:45:35 +08:00
|
|
|
|
{
|
|
|
|
|
void PreInject(object obj);
|
|
|
|
|
}
|
2023-05-30 18:27:30 +08:00
|
|
|
|
public interface IEcsInject<T> : IEcsProcess
|
2023-05-26 03:45:35 +08:00
|
|
|
|
{
|
|
|
|
|
void Inject(T obj);
|
|
|
|
|
}
|
2023-05-30 18:27:30 +08:00
|
|
|
|
public interface IEcsPreInitInjectProcess : IEcsProcess
|
2023-05-26 03:45:35 +08:00
|
|
|
|
{
|
|
|
|
|
void OnPreInitInjectionBefore();
|
|
|
|
|
void OnPreInitInjectionAfter();
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-29 06:19:24 +08:00
|
|
|
|
namespace Internal
|
|
|
|
|
{
|
2023-05-26 03:45:35 +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-05-26 03:45:35 +08:00
|
|
|
|
public bool IsInjectionEnd => _injectCount >= _injectSystems.Length;
|
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 void Destroy()
|
|
|
|
|
{
|
|
|
|
|
_source = null;
|
|
|
|
|
_injectSystems = null;
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-04-23 18:05:27 +08:00
|
|
|
|
[DebugHide, DebugColor(DebugColor.Gray)]
|
2023-05-07 00:50:02 +08:00
|
|
|
|
public sealed class EcsPreInjectRunner : EcsRunner<IEcsPreInject>, IEcsPreInject
|
2023-03-29 06:19:24 +08:00
|
|
|
|
{
|
2023-04-23 18:05:27 +08:00
|
|
|
|
void IEcsPreInject.PreInject(object obj)
|
|
|
|
|
{
|
|
|
|
|
foreach (var item in targets) item.PreInject(obj);
|
|
|
|
|
}
|
2023-03-29 06:19:24 +08:00
|
|
|
|
}
|
2023-04-23 18:05:27 +08:00
|
|
|
|
[DebugHide, DebugColor(DebugColor.Gray)]
|
2023-05-07 00:50:02 +08:00
|
|
|
|
public sealed class EcsInjectRunner<T> : EcsRunner<IEcsInject<T>>, IEcsInject<T>
|
2023-03-29 06:19:24 +08:00
|
|
|
|
{
|
2023-05-30 01:31:04 +08:00
|
|
|
|
private EcsBaseTypeInjectRunner _baseTypeInjectRunner;
|
2023-04-23 18:05:27 +08:00
|
|
|
|
void IEcsInject<T>.Inject(T obj)
|
|
|
|
|
{
|
2023-05-30 01:31:04 +08:00
|
|
|
|
_baseTypeInjectRunner.Inject(obj);
|
2023-04-23 18:05:27 +08:00
|
|
|
|
foreach (var item in targets) item.Inject(obj);
|
|
|
|
|
}
|
|
|
|
|
protected override void OnSetup()
|
|
|
|
|
{
|
2023-05-30 01:31:04 +08:00
|
|
|
|
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);
|
2023-04-23 18:05:27 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2023-05-30 01:31:04 +08:00
|
|
|
|
internal abstract class EcsBaseTypeInjectRunner
|
|
|
|
|
{
|
|
|
|
|
public abstract void Inject(object obj);
|
|
|
|
|
}
|
|
|
|
|
internal class EcsBaseTypeInjectRunner<T> : EcsBaseTypeInjectRunner
|
|
|
|
|
{
|
|
|
|
|
private IEcsInject<T> _runner;
|
|
|
|
|
public EcsBaseTypeInjectRunner(EcsPipeline pipeline) => _runner = pipeline.GetRunner<IEcsInject<T>>();
|
|
|
|
|
public override void Inject(object obj) => _runner.Inject((T)obj);
|
|
|
|
|
}
|
|
|
|
|
internal class EcsObjectTypePreInjectRunner : EcsBaseTypeInjectRunner
|
|
|
|
|
{
|
|
|
|
|
private IEcsPreInject _runner;
|
|
|
|
|
public EcsObjectTypePreInjectRunner(EcsPipeline pipeline) => _runner = pipeline.GetRunner<IEcsPreInject>();
|
|
|
|
|
public override void Inject(object obj) => _runner.PreInject(obj);
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-23 18:05:27 +08:00
|
|
|
|
[DebugHide, DebugColor(DebugColor.Gray)]
|
2023-05-07 00:50:02 +08:00
|
|
|
|
public sealed class EcsPreInitInjectProcessRunner : EcsRunner<IEcsPreInitInjectProcess>, IEcsPreInitInjectProcess
|
2023-04-23 18:05:27 +08:00
|
|
|
|
{
|
|
|
|
|
public void OnPreInitInjectionAfter()
|
|
|
|
|
{
|
|
|
|
|
foreach (var item in targets) item.OnPreInitInjectionAfter();
|
|
|
|
|
}
|
|
|
|
|
public void OnPreInitInjectionBefore()
|
|
|
|
|
{
|
|
|
|
|
foreach (var item in targets) item.OnPreInitInjectionBefore();
|
|
|
|
|
}
|
2023-03-12 02:02:39 +08:00
|
|
|
|
}
|
2023-05-26 03:45:35 +08:00
|
|
|
|
public class InjectSystemBase { }
|
|
|
|
|
[DebugHide, DebugColor(DebugColor.Gray)]
|
|
|
|
|
public class InjectSystem<T> : InjectSystemBase, IEcsPreInitProcess, IEcsInject<PreInitInjectController>, IEcsPreInitInjectProcess
|
2023-02-13 21:11:54 +08:00
|
|
|
|
{
|
2023-05-26 03:45:35 +08:00
|
|
|
|
private T _injectedData;
|
|
|
|
|
private PreInitInjectController _injectController;
|
|
|
|
|
void IEcsInject<PreInitInjectController>.Inject(PreInitInjectController obj) => _injectController = obj;
|
|
|
|
|
public InjectSystem(T injectedData)
|
2023-03-29 15:48:37 +08:00
|
|
|
|
{
|
2023-05-26 03:45:35 +08:00
|
|
|
|
_injectedData = injectedData;
|
2023-03-29 06:19:24 +08:00
|
|
|
|
}
|
2023-05-26 03:45:35 +08:00
|
|
|
|
public void PreInit(EcsPipeline pipeline)
|
2023-03-29 06:19:24 +08:00
|
|
|
|
{
|
2023-05-26 03:45:35 +08:00
|
|
|
|
if (_injectedData == null) return;
|
|
|
|
|
if (_injectController == null)
|
|
|
|
|
{
|
|
|
|
|
_injectController = new PreInitInjectController(pipeline);
|
|
|
|
|
var injectMapRunner = pipeline.GetRunner<IEcsInject<PreInitInjectController>>();
|
|
|
|
|
pipeline.GetRunner<IEcsPreInitInjectProcess>().OnPreInitInjectionBefore();
|
|
|
|
|
injectMapRunner.Inject(_injectController);
|
|
|
|
|
}
|
|
|
|
|
var injectRunnerGeneric = pipeline.GetRunner<IEcsInject<T>>();
|
|
|
|
|
injectRunnerGeneric.Inject(_injectedData);
|
|
|
|
|
if (_injectController.OnInject())
|
|
|
|
|
{
|
|
|
|
|
_injectController.Destroy();
|
|
|
|
|
var injectCallbacksRunner = pipeline.GetRunner<IEcsPreInitInjectProcess>();
|
|
|
|
|
injectCallbacksRunner.OnPreInitInjectionAfter();
|
|
|
|
|
EcsRunner.Destroy(injectCallbacksRunner);
|
|
|
|
|
}
|
2023-05-31 04:09:55 +08:00
|
|
|
|
_injectedData = default;
|
2023-03-29 06:19:24 +08:00
|
|
|
|
}
|
2023-05-26 03:45:35 +08:00
|
|
|
|
public void OnPreInitInjectionBefore() { }
|
|
|
|
|
public void OnPreInitInjectionAfter() => _injectController = null;
|
2023-02-13 21:11:54 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-05-26 03:45:35 +08:00
|
|
|
|
public static class InjectSystemExtensions
|
2023-02-13 21:11:54 +08:00
|
|
|
|
{
|
2023-03-30 05:32:43 +08:00
|
|
|
|
public static EcsPipeline.Builder Inject<T>(this EcsPipeline.Builder self, T data)
|
2023-02-13 21:11:54 +08:00
|
|
|
|
{
|
2023-04-26 16:45:37 +08:00
|
|
|
|
return self.Add(new InjectSystem<T>(data));
|
2023-02-13 21:11:54 +08:00
|
|
|
|
}
|
2023-03-30 05:32:43 +08:00
|
|
|
|
public static EcsPipeline.Builder Inject<A, B>(this EcsPipeline.Builder self, A a, B b)
|
2023-02-13 21:11:54 +08:00
|
|
|
|
{
|
2023-04-26 16:45:37 +08:00
|
|
|
|
return self.Inject(a).Inject(b);
|
|
|
|
|
}
|
|
|
|
|
public static EcsPipeline.Builder Inject<A, B, C>(this EcsPipeline.Builder self, A a, B b, C c)
|
|
|
|
|
{
|
|
|
|
|
return self.Inject(a).Inject(b).Inject(c);
|
2023-02-13 21:11:54 +08:00
|
|
|
|
}
|
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-02-13 21:11:54 +08:00
|
|
|
|
{
|
2023-04-26 16:45:37 +08:00
|
|
|
|
return self.Inject(a).Inject(b).Inject(c).Inject(d);
|
2023-02-13 21:11:54 +08:00
|
|
|
|
}
|
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
|
|
|
|
{
|
2023-04-26 16:45:37 +08:00
|
|
|
|
return self.Inject(a).Inject(b).Inject(c).Inject(d).Inject(e);
|
2023-03-26 11:19:03 +08:00
|
|
|
|
}
|
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-02-13 21:11:54 +08:00
|
|
|
|
{
|
2023-04-26 16:45:37 +08:00
|
|
|
|
return self.Inject(a).Inject(b).Inject(c).Inject(d).Inject(e).Inject(f);
|
2023-02-13 21:11:54 +08:00
|
|
|
|
}
|
2023-04-24 17:34:38 +08:00
|
|
|
|
public static EcsPipeline.Builder Inject<A, B, C, D, E, F, G>(this EcsPipeline.Builder self, A a, B b, C c, D d, E e, F f, G g)
|
|
|
|
|
{
|
2023-04-26 16:45:37 +08:00
|
|
|
|
return self.Inject(a).Inject(b).Inject(c).Inject(d).Inject(e).Inject(f).Inject(g);
|
2023-04-24 17:34:38 +08:00
|
|
|
|
}
|
2023-04-24 17:37:20 +08:00
|
|
|
|
public static EcsPipeline.Builder Inject<A, B, C, D, E, F, G, H>(this EcsPipeline.Builder self, A a, B b, C c, D d, E e, F f, G g, H h)
|
2023-04-24 17:34:38 +08:00
|
|
|
|
{
|
2023-04-26 16:45:37 +08:00
|
|
|
|
return self.Inject(a).Inject(b).Inject(c).Inject(d).Inject(e).Inject(f).Inject(g).Inject(h);
|
2023-04-24 17:34:38 +08:00
|
|
|
|
}
|
2023-02-13 21:11:54 +08:00
|
|
|
|
}
|
|
|
|
|
}
|