Merge branch 'dev'

This commit is contained in:
Mikhail 2024-03-26 18:09:31 +08:00
commit 0f30565acf

View File

@ -13,41 +13,50 @@ namespace DCFApixels.DragonECS
private bool _isBuilt = false; private bool _isBuilt = false;
[ThreadStatic] [ThreadStatic]
private static bool _isConstructorStream; private static Stack<Builder> _constructorBuildersStack = null;
[ThreadStatic] private static Stack<Builder> GetBuildersStack()
private static Builder _constructorStreamBuilder; {
if(_constructorBuildersStack == null)
{
_constructorBuildersStack = new Stack<Builder>();
}
return _constructorBuildersStack;
}
protected static IncludeMarker Inc protected static IncludeMarker Inc
{ {
get get
{ {
if(_isConstructorStream == false) var buildersStack = GetBuildersStack();
if (buildersStack.Count <= 0)
{ //TODO перевести { //TODO перевести
throw new InvalidOperationException($"{nameof(Inc)} можно использовать только во время инициализации полей и в конструкторе");//TODO Перевести throw new InvalidOperationException($"{nameof(Inc)} можно использовать только во время инициализации полей и в конструкторе");//TODO Перевести
} }
return _constructorStreamBuilder.Inc; return buildersStack.Peek().Inc;
} }
} }
protected static ExcludeMarker Exc protected static ExcludeMarker Exc
{ {
get get
{ {
if (_isConstructorStream == false) var buildersStack = GetBuildersStack();
if (buildersStack.Count <= 0)
{ //TODO перевести { //TODO перевести
throw new InvalidOperationException($"{nameof(Exc)} можно использовать только во время инициализации полей и в конструкторе");//TODO Перевести throw new InvalidOperationException($"{nameof(Exc)} можно использовать только во время инициализации полей и в конструкторе");//TODO Перевести
} }
return _constructorStreamBuilder.Exc; return buildersStack.Peek().Exc;
} }
} }
protected static OptionalMarker Opt protected static OptionalMarker Opt
{ {
get get
{ {
if (_isConstructorStream == false) var buildersStack = GetBuildersStack();
if (buildersStack.Count <= 0)
{ //TODO перевести { //TODO перевести
throw new InvalidOperationException($"{nameof(Opt)} можно использовать только во время инициализации полей и в конструкторе");//TODO Перевести throw new InvalidOperationException($"{nameof(Opt)} можно использовать только во время инициализации полей и в конструкторе");//TODO Перевести
} }
return _constructorStreamBuilder.Opt; return buildersStack.Peek().Opt;
} }
} }
@ -82,10 +91,11 @@ namespace DCFApixels.DragonECS
protected virtual void Init(Builder b) { } protected virtual void Init(Builder b) { }
public sealed class Builder public sealed class Builder
{ {
private static int incr = 0;
public int id = incr++;
private EcsWorld _world; private EcsWorld _world;
private EcsMask.Builder _maskBuilder; private EcsMask.Builder _maskBuilder;
private bool _isBuilt = false; private bool _isBuilt = false;
public IncludeMarker Inc public IncludeMarker Inc
{ {
get { return new IncludeMarker(this); } get { return new IncludeMarker(this); }
@ -115,17 +125,11 @@ namespace DCFApixels.DragonECS
#if !REFLECTION_DISABLED #if !REFLECTION_DISABLED
ConstructorInfo constructorInfo = aspectType.GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] { typeof(Builder) }, null); ConstructorInfo constructorInfo = aspectType.GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] { typeof(Builder) }, null);
if (_isConstructorStream == true) var buildersStack = GetBuildersStack();
{ buildersStack.Push(builder);
throw new InvalidOperationException("Нельзя рекурсивно вызывать конструктор аспекта");//TODO Перевести
}
_constructorStreamBuilder = builder;
_isConstructorStream = true;
if (constructorInfo != null) if (constructorInfo != null)
{ {
newAspect = (EcsAspect)constructorInfo.Invoke(new object[] { builder }); newAspect = (EcsAspect)constructorInfo.Invoke(new object[] { builder });
_constructorStreamBuilder = null;
_isConstructorStream = false;
} }
else else
#endif #endif
@ -133,10 +137,9 @@ namespace DCFApixels.DragonECS
#pragma warning disable IL2091 // Target generic argument does not satisfy 'DynamicallyAccessedMembersAttribute' in target method or type. The generic parameter of the source method or type does not have matching annotations. #pragma warning disable IL2091 // Target generic argument does not satisfy 'DynamicallyAccessedMembersAttribute' in target method or type. The generic parameter of the source method or type does not have matching annotations.
newAspect = Activator.CreateInstance<TAspect>(); newAspect = Activator.CreateInstance<TAspect>();
#pragma warning restore IL2091 #pragma warning restore IL2091
_constructorStreamBuilder = null;
_isConstructorStream = false;
newAspect.Init(builder);
} }
newAspect.Init(builder);
buildersStack.Pop();
newAspect._source = world; newAspect._source = world;
builder.Build(out newAspect._mask); builder.Build(out newAspect._mask);
newAspect._isBuilt = true; newAspect._isBuilt = true;