rename Subject to Aspect

This commit is contained in:
Mikhail 2023-06-22 14:31:13 +08:00
parent 65878aa9a0
commit 2b5cc8b27b
13 changed files with 398 additions and 395 deletions

317
src/Builtin/Aspects.cs Normal file
View File

@ -0,0 +1,317 @@
namespace DCFApixels.DragonECS
{
public sealed class EmptyAspect : EcsAspect { }
public sealed class SingleAspect<TPool> : EcsAspect where TPool : IEcsPoolImplementation, new()
{
public readonly TPool pool;
public SingleAspect(Builder b)
{
pool = b.Include<TPool>();
}
}
public sealed class CombinedAspect<A0, A1> : EcsAspect
where A0 : EcsAspect
where A1 : EcsAspect
{
public readonly A0 a0;
public readonly A1 a1;
public CombinedAspect(Builder b)
{
a0 = b.Combine<A0>(0);
a1 = b.Combine<A1>(1);
}
}
public sealed class CombinedAspect<A0, A1, A2> : EcsAspect
where A0 : EcsAspect
where A1 : EcsAspect
where A2 : EcsAspect
{
public readonly A0 a0;
public readonly A1 a1;
public readonly A2 a2;
public CombinedAspect(Builder b)
{
a0 = b.Combine<A0>(0);
a1 = b.Combine<A1>(1);
a2 = b.Combine<A2>(2);
}
}
public sealed class CombinedAspect<A0, A1, A2, A3> : EcsAspect
where A0 : EcsAspect
where A1 : EcsAspect
where A2 : EcsAspect
where A3 : EcsAspect
{
public readonly A0 a0;
public readonly A1 a1;
public readonly A2 a2;
public readonly A3 a3;
public CombinedAspect(Builder b)
{
a0 = b.Combine<A0>(0);
a1 = b.Combine<A1>(1);
a2 = b.Combine<A2>(2);
a3 = b.Combine<A3>(3);
}
}
public sealed class CombinedAspect<A0, A1, A2, A3, A4> : EcsAspect
where A0 : EcsAspect
where A1 : EcsAspect
where A2 : EcsAspect
where A3 : EcsAspect
where A4 : EcsAspect
{
public readonly A0 a0;
public readonly A1 a1;
public readonly A2 a2;
public readonly A3 a3;
public readonly A4 a4;
public CombinedAspect(Builder b)
{
a0 = b.Combine<A0>(0);
a1 = b.Combine<A1>(1);
a2 = b.Combine<A2>(2);
a3 = b.Combine<A3>(3);
a4 = b.Combine<A4>(4);
}
}
public sealed class CombinedAspect<A0, A1, A2, A3, A4, A5> : EcsAspect
where A0 : EcsAspect
where A1 : EcsAspect
where A2 : EcsAspect
where A3 : EcsAspect
where A4 : EcsAspect
where A5 : EcsAspect
{
public readonly A0 a0;
public readonly A1 a1;
public readonly A2 a2;
public readonly A3 a3;
public readonly A4 a4;
public readonly A5 a5;
public CombinedAspect(Builder b)
{
a0 = b.Combine<A0>(0);
a1 = b.Combine<A1>(1);
a2 = b.Combine<A2>(2);
a3 = b.Combine<A3>(3);
a4 = b.Combine<A4>(4);
a5 = b.Combine<A5>(5);
}
}
public static class CombinedAspectExtensions
{
#region Where 2
public static EcsReadonlyGroup Where<A0, A1>(this EcsWorld self, out A0 a0, out A1 a1)
where A0 : EcsAspect
where A1 : EcsAspect
{
return self.WhereFor(self.Entities, out a0, out a1);
}
public static EcsReadonlyGroup WhereFor<A0, A1>(this EcsWorld self, EcsReadonlyGroup sourceGroup, out A0 a0, out A1 a1)
where A0 : EcsAspect
where A1 : EcsAspect
{
var combined = self.GetAspect<CombinedAspect<A0, A1>>();
a0 = combined.a0;
a1 = combined.a1;
return self.WhereFor<CombinedAspect<A0, A1>>(sourceGroup);
}
public static EcsReadonlyGroup Where<A0, A1>(this EcsWorld self)
where A0 : EcsAspect
where A1 : EcsAspect
{
return self.Where<CombinedAspect<A0, A1>>();
}
public static EcsReadonlyGroup WhereFor<A0, A1>(this EcsWorld self, EcsReadonlyGroup sourceGroup)
where A0 : EcsAspect
where A1 : EcsAspect
{
return self.WhereFor<CombinedAspect<A0, A1>>(sourceGroup);
}
#endregion
#region Where 3
public static EcsReadonlyGroup Where<A0, A1, A2>(this EcsWorld self, out A0 a0, out A1 a1, out A2 a2)
where A0 : EcsAspect
where A1 : EcsAspect
where A2 : EcsAspect
{
return self.WhereFor(self.Entities, out a0, out a1, out a2);
}
public static EcsReadonlyGroup WhereFor<A0, A1, A2>(this EcsWorld self, EcsReadonlyGroup sourceGroup, out A0 a0, out A1 a1, out A2 a2)
where A0 : EcsAspect
where A1 : EcsAspect
where A2 : EcsAspect
{
var combined = self.GetAspect<CombinedAspect<A0, A1, A2>>();
a0 = combined.a0;
a1 = combined.a1;
a2 = combined.a2;
return self.WhereFor<CombinedAspect<A0, A1, A2>>(sourceGroup);
}
public static EcsReadonlyGroup Where<A0, A1, A2>(this EcsWorld self)
where A0 : EcsAspect
where A1 : EcsAspect
where A2 : EcsAspect
{
return self.Where<CombinedAspect<A0, A1, A2>>();
}
public static EcsReadonlyGroup WhereFor<A0, A1, A2>(this EcsWorld self, EcsReadonlyGroup sourceGroup)
where A0 : EcsAspect
where A1 : EcsAspect
where A2 : EcsAspect
{
return self.WhereFor<CombinedAspect<A0, A1, A2>>(sourceGroup);
}
#endregion
#region Where 4
public static EcsReadonlyGroup Where<A0, A1, A2, A3>(this EcsWorld self, out A0 a0, out A1 a1, out A2 a2, out A3 a3)
where A0 : EcsAspect
where A1 : EcsAspect
where A2 : EcsAspect
where A3 : EcsAspect
{
return self.WhereFor(self.Entities, out a0, out a1, out a2, out a3);
}
public static EcsReadonlyGroup WhereFor<A0, A1, A2, A3>(this EcsWorld self, EcsReadonlyGroup sourceGroup, out A0 a0, out A1 a1, out A2 a2, out A3 a3)
where A0 : EcsAspect
where A1 : EcsAspect
where A2 : EcsAspect
where A3 : EcsAspect
{
var combined = self.GetAspect<CombinedAspect<A0, A1, A2, A3>>();
a0 = combined.a0;
a1 = combined.a1;
a2 = combined.a2;
a3 = combined.a3;
return self.WhereFor<CombinedAspect<A0, A1, A2, A3>>(sourceGroup);
}
public static EcsReadonlyGroup Where<A0, A1, A2, A3>(this EcsWorld self)
where A0 : EcsAspect
where A1 : EcsAspect
where A2 : EcsAspect
where A3 : EcsAspect
{
return self.Where<CombinedAspect<A0, A1, A2, A3>>();
}
public static EcsReadonlyGroup WhereFor<A0, A1, A2, A3>(this EcsWorld self, EcsReadonlyGroup sourceGroup)
where A0 : EcsAspect
where A1 : EcsAspect
where A2 : EcsAspect
where A3 : EcsAspect
{
return self.WhereFor<CombinedAspect<A0, A1, A2, A3>>(sourceGroup);
}
#endregion
#region Where 5
public static EcsReadonlyGroup Where<A0, A1, A2, A3, A4>(this EcsWorld self, out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4)
where A0 : EcsAspect
where A1 : EcsAspect
where A2 : EcsAspect
where A3 : EcsAspect
where A4 : EcsAspect
{
return self.WhereFor(self.Entities, out a0, out a1, out a2, out a3, out a4);
}
public static EcsReadonlyGroup WhereFor<A0, A1, A2, A3, A4>(this EcsWorld self, EcsReadonlyGroup sourceGroup, out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4)
where A0 : EcsAspect
where A1 : EcsAspect
where A2 : EcsAspect
where A3 : EcsAspect
where A4 : EcsAspect
{
var combined = self.GetAspect<CombinedAspect<A0, A1, A2, A3, A4>>();
a0 = combined.a0;
a1 = combined.a1;
a2 = combined.a2;
a3 = combined.a3;
a4 = combined.a4;
return self.WhereFor<CombinedAspect<A0, A1, A2, A3, A4>>(sourceGroup);
}
public static EcsReadonlyGroup Where<A0, A1, A2, A3, A4>(this EcsWorld self)
where A0 : EcsAspect
where A1 : EcsAspect
where A2 : EcsAspect
where A3 : EcsAspect
where A4 : EcsAspect
{
return self.Where<CombinedAspect<A0, A1, A2, A3, A4>>();
}
public static EcsReadonlyGroup WhereFor<A0, A1, A2, A3, A4>(this EcsWorld self, EcsReadonlyGroup sourceGroup)
where A0 : EcsAspect
where A1 : EcsAspect
where A2 : EcsAspect
where A3 : EcsAspect
where A4 : EcsAspect
{
return self.WhereFor<CombinedAspect<A0, A1, A2, A3, A4>>(sourceGroup);
}
#endregion
#region Where 6
public static EcsReadonlyGroup Where<A0, A1, A2, A3, A4, A5>(this EcsWorld self, out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4, out A5 a5)
where A0 : EcsAspect
where A1 : EcsAspect
where A2 : EcsAspect
where A3 : EcsAspect
where A4 : EcsAspect
where A5 : EcsAspect
{
return self.WhereFor(self.Entities, out a0, out a1, out a2, out a3, out a4, out a5);
}
public static EcsReadonlyGroup WhereFor<A0, A1, A2, A3, A4, A5>(this EcsWorld self, EcsReadonlyGroup sourceGroup, out A0 a0, out A1 a1, out A2 a2, out A3 a3, out A4 a4, out A5 a5)
where A0 : EcsAspect
where A1 : EcsAspect
where A2 : EcsAspect
where A3 : EcsAspect
where A4 : EcsAspect
where A5 : EcsAspect
{
var combined = self.GetAspect<CombinedAspect<A0, A1, A2, A3, A4, A5>>();
a0 = combined.a0;
a1 = combined.a1;
a2 = combined.a2;
a3 = combined.a3;
a4 = combined.a4;
a5 = combined.a5;
return self.WhereFor<CombinedAspect<A0, A1, A2, A3, A4, A5>>(sourceGroup);
}
public static EcsReadonlyGroup Where<A0, A1, A2, A3, A4, A5>(this EcsWorld self)
where A0 : EcsAspect
where A1 : EcsAspect
where A2 : EcsAspect
where A3 : EcsAspect
where A4 : EcsAspect
where A5 : EcsAspect
{
return self.Where<CombinedAspect<A0, A1, A2, A3, A4, A5>>();
}
public static EcsReadonlyGroup WhereFor<A0, A1, A2, A3, A4, A5>(this EcsWorld self, EcsReadonlyGroup sourceGroup)
where A0 : EcsAspect
where A1 : EcsAspect
where A2 : EcsAspect
where A3 : EcsAspect
where A4 : EcsAspect
where A5 : EcsAspect
{
return self.WhereFor<CombinedAspect<A0, A1, A2, A3, A4, A5>>(sourceGroup);
}
#endregion
}
}

View File

@ -141,9 +141,12 @@ namespace DCFApixels.DragonECS
} }
} }
public static class InjectSystemExtensions public static partial class EcsPipelineExtensions
{ {
public static void Inject<T>(EcsPipeline self, T data) => self.GetRunner<IEcsInject<T>>().Inject(data); public static void Inject<T>(EcsPipeline self, T data) => self.GetRunner<IEcsInject<T>>().Inject(data);
}
public static partial class EcsPipelineBuilderExtensions
{
public static EcsPipeline.Builder Inject<T>(this EcsPipeline.Builder self, T data) public static EcsPipeline.Builder Inject<T>(this EcsPipeline.Builder self, T data)
{ {
if (data == null) throw new ArgumentNullException(); if (data == null) throw new ArgumentNullException();

View File

@ -1,317 +0,0 @@
namespace DCFApixels.DragonECS
{
public sealed class EmptySubject : EcsSubject { }
public sealed class SingleSubject<TPool> : EcsSubject where TPool : IEcsPoolImplementation, new()
{
public readonly TPool pool;
public SingleSubject(Builder b)
{
pool = b.Include<TPool>();
}
}
public sealed class CombinedSubject<S0, S1> : EcsSubject
where S0 : EcsSubject
where S1 : EcsSubject
{
public readonly S0 s0;
public readonly S1 s1;
public CombinedSubject(Builder b)
{
s0 = b.Combine<S0>(0);
s1 = b.Combine<S1>(1);
}
}
public sealed class CombinedSubject<S0, S1, S2> : EcsSubject
where S0 : EcsSubject
where S1 : EcsSubject
where S2 : EcsSubject
{
public readonly S0 s0;
public readonly S1 s1;
public readonly S2 s2;
public CombinedSubject(Builder b)
{
s0 = b.Combine<S0>(0);
s1 = b.Combine<S1>(1);
s2 = b.Combine<S2>(2);
}
}
public sealed class CombinedSubject<S0, S1, S2, S3> : EcsSubject
where S0 : EcsSubject
where S1 : EcsSubject
where S2 : EcsSubject
where S3 : EcsSubject
{
public readonly S0 s0;
public readonly S1 s1;
public readonly S2 s2;
public readonly S3 s3;
public CombinedSubject(Builder b)
{
s0 = b.Combine<S0>(0);
s1 = b.Combine<S1>(1);
s2 = b.Combine<S2>(2);
s3 = b.Combine<S3>(3);
}
}
public sealed class CombinedSubject<S0, S1, S2, S3, S4> : EcsSubject
where S0 : EcsSubject
where S1 : EcsSubject
where S2 : EcsSubject
where S3 : EcsSubject
where S4 : EcsSubject
{
public readonly S0 s0;
public readonly S1 s1;
public readonly S2 s2;
public readonly S3 s3;
public readonly S4 s4;
public CombinedSubject(Builder b)
{
s0 = b.Combine<S0>(0);
s1 = b.Combine<S1>(1);
s2 = b.Combine<S2>(2);
s3 = b.Combine<S3>(3);
s4 = b.Combine<S4>(4);
}
}
public sealed class CombinedSubject<S0, S1, S2, S3, S4, S5> : EcsSubject
where S0 : EcsSubject
where S1 : EcsSubject
where S2 : EcsSubject
where S3 : EcsSubject
where S4 : EcsSubject
where S5 : EcsSubject
{
public readonly S0 s0;
public readonly S1 s1;
public readonly S2 s2;
public readonly S3 s3;
public readonly S4 s4;
public readonly S5 s5;
public CombinedSubject(Builder b)
{
s0 = b.Combine<S0>(0);
s1 = b.Combine<S1>(1);
s2 = b.Combine<S2>(2);
s3 = b.Combine<S3>(3);
s4 = b.Combine<S4>(4);
s5 = b.Combine<S5>(5);
}
}
public static class CombinedSubjectExtensions
{
#region Where 2
public static EcsReadonlyGroup Where<S0, S1>(this EcsWorld self, out S0 s0, out S1 s1)
where S0 : EcsSubject
where S1 : EcsSubject
{
return self.WhereFor(self.Entities, out s0, out s1);
}
public static EcsReadonlyGroup WhereFor<S0, S1>(this EcsWorld self, EcsReadonlyGroup sourceGroup, out S0 s0, out S1 s1)
where S0 : EcsSubject
where S1 : EcsSubject
{
var combined = self.GetSubject<CombinedSubject<S0, S1>>();
s0 = combined.s0;
s1 = combined.s1;
return self.WhereFor<CombinedSubject<S0, S1>>(sourceGroup);
}
public static EcsReadonlyGroup Where<S0, S1>(this EcsWorld self)
where S0 : EcsSubject
where S1 : EcsSubject
{
return self.Where<CombinedSubject<S0, S1>>();
}
public static EcsReadonlyGroup WhereFor<S0, S1>(this EcsWorld self, EcsReadonlyGroup sourceGroup)
where S0 : EcsSubject
where S1 : EcsSubject
{
return self.WhereFor<CombinedSubject<S0, S1>>(sourceGroup);
}
#endregion
#region Where 3
public static EcsReadonlyGroup Where<S0, S1, S2>(this EcsWorld self, out S0 s0, out S1 s1, out S2 s2)
where S0 : EcsSubject
where S1 : EcsSubject
where S2 : EcsSubject
{
return self.WhereFor(self.Entities, out s0, out s1, out s2);
}
public static EcsReadonlyGroup WhereFor<S0, S1, S2>(this EcsWorld self, EcsReadonlyGroup sourceGroup, out S0 s0, out S1 s1, out S2 s2)
where S0 : EcsSubject
where S1 : EcsSubject
where S2 : EcsSubject
{
var combined = self.GetSubject<CombinedSubject<S0, S1, S2>>();
s0 = combined.s0;
s1 = combined.s1;
s2 = combined.s2;
return self.WhereFor<CombinedSubject<S0, S1, S2>>(sourceGroup);
}
public static EcsReadonlyGroup Where<S0, S1, S2>(this EcsWorld self)
where S0 : EcsSubject
where S1 : EcsSubject
where S2 : EcsSubject
{
return self.Where<CombinedSubject<S0, S1, S2>>();
}
public static EcsReadonlyGroup WhereFor<S0, S1, S2>(this EcsWorld self, EcsReadonlyGroup sourceGroup)
where S0 : EcsSubject
where S1 : EcsSubject
where S2 : EcsSubject
{
return self.WhereFor<CombinedSubject<S0, S1, S2>>(sourceGroup);
}
#endregion
#region Where 4
public static EcsReadonlyGroup Where<S0, S1, S2, S3>(this EcsWorld self, out S0 s0, out S1 s1, out S2 s2, out S3 s3)
where S0 : EcsSubject
where S1 : EcsSubject
where S2 : EcsSubject
where S3 : EcsSubject
{
return self.WhereFor(self.Entities, out s0, out s1, out s2, out s3);
}
public static EcsReadonlyGroup WhereFor<S0, S1, S2, S3>(this EcsWorld self, EcsReadonlyGroup sourceGroup, out S0 s0, out S1 s1, out S2 s2, out S3 s3)
where S0 : EcsSubject
where S1 : EcsSubject
where S2 : EcsSubject
where S3 : EcsSubject
{
var combined = self.GetSubject<CombinedSubject<S0, S1, S2, S3>>();
s0 = combined.s0;
s1 = combined.s1;
s2 = combined.s2;
s3 = combined.s3;
return self.WhereFor<CombinedSubject<S0, S1, S2, S3>>(sourceGroup);
}
public static EcsReadonlyGroup Where<S0, S1, S2, S3>(this EcsWorld self)
where S0 : EcsSubject
where S1 : EcsSubject
where S2 : EcsSubject
where S3 : EcsSubject
{
return self.Where<CombinedSubject<S0, S1, S2, S3>>();
}
public static EcsReadonlyGroup WhereFor<S0, S1, S2, S3>(this EcsWorld self, EcsReadonlyGroup sourceGroup)
where S0 : EcsSubject
where S1 : EcsSubject
where S2 : EcsSubject
where S3 : EcsSubject
{
return self.WhereFor<CombinedSubject<S0, S1, S2, S3>>(sourceGroup);
}
#endregion
#region Where 5
public static EcsReadonlyGroup Where<S0, S1, S2, S3, S4>(this EcsWorld self, out S0 s0, out S1 s1, out S2 s2, out S3 s3, out S4 s4)
where S0 : EcsSubject
where S1 : EcsSubject
where S2 : EcsSubject
where S3 : EcsSubject
where S4 : EcsSubject
{
return self.WhereFor(self.Entities, out s0, out s1, out s2, out s3, out s4);
}
public static EcsReadonlyGroup WhereFor<S0, S1, S2, S3, S4>(this EcsWorld self, EcsReadonlyGroup sourceGroup, out S0 s0, out S1 s1, out S2 s2, out S3 s3, out S4 s4)
where S0 : EcsSubject
where S1 : EcsSubject
where S2 : EcsSubject
where S3 : EcsSubject
where S4 : EcsSubject
{
var combined = self.GetSubject<CombinedSubject<S0, S1, S2, S3, S4>>();
s0 = combined.s0;
s1 = combined.s1;
s2 = combined.s2;
s3 = combined.s3;
s4 = combined.s4;
return self.WhereFor<CombinedSubject<S0, S1, S2, S3, S4>>(sourceGroup);
}
public static EcsReadonlyGroup Where<S0, S1, S2, S3, S4>(this EcsWorld self)
where S0 : EcsSubject
where S1 : EcsSubject
where S2 : EcsSubject
where S3 : EcsSubject
where S4 : EcsSubject
{
return self.Where<CombinedSubject<S0, S1, S2, S3, S4>>();
}
public static EcsReadonlyGroup WhereFor<S0, S1, S2, S3, S4>(this EcsWorld self, EcsReadonlyGroup sourceGroup)
where S0 : EcsSubject
where S1 : EcsSubject
where S2 : EcsSubject
where S3 : EcsSubject
where S4 : EcsSubject
{
return self.WhereFor<CombinedSubject<S0, S1, S2, S3, S4>>(sourceGroup);
}
#endregion
#region Where 6
public static EcsReadonlyGroup Where<S0, S1, S2, S3, S4, S5>(this EcsWorld self, out S0 s0, out S1 s1, out S2 s2, out S3 s3, out S4 s4, out S5 s5)
where S0 : EcsSubject
where S1 : EcsSubject
where S2 : EcsSubject
where S3 : EcsSubject
where S4 : EcsSubject
where S5 : EcsSubject
{
return self.WhereFor(self.Entities, out s0, out s1, out s2, out s3, out s4, out s5);
}
public static EcsReadonlyGroup WhereFor<S0, S1, S2, S3, S4, S5>(this EcsWorld self, EcsReadonlyGroup sourceGroup, out S0 s0, out S1 s1, out S2 s2, out S3 s3, out S4 s4, out S5 s5)
where S0 : EcsSubject
where S1 : EcsSubject
where S2 : EcsSubject
where S3 : EcsSubject
where S4 : EcsSubject
where S5 : EcsSubject
{
var combined = self.GetSubject<CombinedSubject<S0, S1, S2, S3, S4, S5>>();
s0 = combined.s0;
s1 = combined.s1;
s2 = combined.s2;
s3 = combined.s3;
s4 = combined.s4;
s5 = combined.s5;
return self.WhereFor<CombinedSubject<S0, S1, S2, S3, S4, S5>>(sourceGroup);
}
public static EcsReadonlyGroup Where<S0, S1, S2, S3, S4, S5>(this EcsWorld self)
where S0 : EcsSubject
where S1 : EcsSubject
where S2 : EcsSubject
where S3 : EcsSubject
where S4 : EcsSubject
where S5 : EcsSubject
{
return self.Where<CombinedSubject<S0, S1, S2, S3, S4, S5>>();
}
public static EcsReadonlyGroup WhereFor<S0, S1, S2, S3, S4, S5>(this EcsWorld self, EcsReadonlyGroup sourceGroup)
where S0 : EcsSubject
where S1 : EcsSubject
where S2 : EcsSubject
where S3 : EcsSubject
where S4 : EcsSubject
where S5 : EcsSubject
{
return self.WhereFor<CombinedSubject<S0, S1, S2, S3, S4, S5>>(sourceGroup);
}
#endregion
}
}

View File

@ -26,10 +26,10 @@ namespace DCFApixels.DragonECS
public class DeleteOneFrameComponentSystem<TComponent> : IEcsRunProcess, IEcsInject<EcsWorld> public class DeleteOneFrameComponentSystem<TComponent> : IEcsRunProcess, IEcsInject<EcsWorld>
where TComponent : struct, IEcsComponent where TComponent : struct, IEcsComponent
{ {
private sealed class Subject : EcsSubject private sealed class Aspect : EcsAspect
{ {
public EcsPool<TComponent> pool; public EcsPool<TComponent> pool;
public Subject(Builder b) => pool = b.Include<TComponent>(); public Aspect(Builder b) => pool = b.Include<TComponent>();
} }
List<EcsWorld> _worlds = new List<EcsWorld>(); List<EcsWorld> _worlds = new List<EcsWorld>();
public void Inject(EcsWorld obj) => _worlds.Add(obj); public void Inject(EcsWorld obj) => _worlds.Add(obj);
@ -40,8 +40,8 @@ namespace DCFApixels.DragonECS
EcsWorld world = _worlds[i]; EcsWorld world = _worlds[i];
if (world.IsComponentTypeDeclared<TComponent>()) if (world.IsComponentTypeDeclared<TComponent>())
{ {
foreach (var e in world.Where(out Subject s)) foreach (var e in world.Where(out Aspect a))
s.pool.Del(e); a.pool.Del(e);
} }
} }
} }

View File

@ -9,7 +9,7 @@ using System.Text;
namespace DCFApixels.DragonECS namespace DCFApixels.DragonECS
{ {
public abstract class EcsSubject public abstract class EcsAspect
{ {
[EditorBrowsable(EditorBrowsableState.Always)] [EditorBrowsable(EditorBrowsableState.Always)]
internal EcsWorld source; internal EcsWorld source;
@ -29,41 +29,41 @@ namespace DCFApixels.DragonECS
#region Builder #region Builder
protected virtual void Init(Builder b) { } protected virtual void Init(Builder b) { }
public sealed class Builder : EcsSubjectBuilderBase public sealed class Builder : EcsAspectBuilderBase
{ {
private EcsWorld _world; private EcsWorld _world;
private HashSet<int> _inc; private HashSet<int> _inc;
private HashSet<int> _exc; private HashSet<int> _exc;
private List<CombinedSubject> _subjects; private List<Combined> _combined;
public EcsWorld World => _world; public EcsWorld World => _world;
private Builder(EcsWorld world) private Builder(EcsWorld world)
{ {
_world = world; _world = world;
_subjects = new List<CombinedSubject>(); _combined = new List<Combined>();
_inc = new HashSet<int>(); _inc = new HashSet<int>();
_exc = new HashSet<int>(); _exc = new HashSet<int>();
} }
internal static TSubject Build<TSubject>(EcsWorld world) where TSubject : EcsSubject internal static TAspect Build<TAspect>(EcsWorld world) where TAspect : EcsAspect
{ {
Builder builder = new Builder(world); Builder builder = new Builder(world);
Type subjectType = typeof(TSubject); Type aspectType = typeof(TAspect);
ConstructorInfo constructorInfo = subjectType.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);
EcsSubject newSubject; EcsAspect newAspect;
if (constructorInfo != null) if (constructorInfo != null)
{ {
newSubject = (EcsSubject)constructorInfo.Invoke(new object[] { builder }); newAspect = (EcsAspect)constructorInfo.Invoke(new object[] { builder });
} }
else else
{ {
newSubject = (EcsSubject)Activator.CreateInstance(typeof(TSubject)); newAspect = (EcsAspect)Activator.CreateInstance(typeof(TAspect));
newSubject.Init(builder); newAspect.Init(builder);
} }
newSubject.source = world; newAspect.source = world;
builder.End(out newSubject.mask); builder.End(out newAspect.mask);
newSubject._isInit = true; newAspect._isInit = true;
return (TSubject)newSubject; return (TAspect)newAspect;
} }
#region Include/Exclude/Optional #region Include/Exclude/Optional
@ -100,10 +100,10 @@ namespace DCFApixels.DragonECS
#endregion #endregion
#region Combine #region Combine
public TOtherSubject Combine<TOtherSubject>(int order = 0) where TOtherSubject : EcsSubject public TOtherAspect Combine<TOtherAspect>(int order = 0) where TOtherAspect : EcsAspect
{ {
var result = _world.GetSubject<TOtherSubject>(); var result = _world.GetAspect<TOtherAspect>();
_subjects.Add(new CombinedSubject(result, order)); _combined.Add(new Combined(result, order));
return result; return result;
} }
#endregion #endregion
@ -117,14 +117,14 @@ namespace DCFApixels.DragonECS
{ {
HashSet<int> maskInc; HashSet<int> maskInc;
HashSet<int> maskExc; HashSet<int> maskExc;
if (_subjects.Count > 0) if (_combined.Count > 0)
{ {
maskInc = new HashSet<int>(); maskInc = new HashSet<int>();
maskExc = new HashSet<int>(); maskExc = new HashSet<int>();
_subjects.Sort((a, b) => a.order - b.order); _combined.Sort((a, b) => a.order - b.order);
foreach (var item in _subjects) foreach (var item in _combined)
{ {
EcsMask submask = item.subject.mask; EcsMask submask = item.aspect.mask;
maskInc.ExceptWith(submask._exc);//удаляю конфликтующие ограничения maskInc.ExceptWith(submask._exc);//удаляю конфликтующие ограничения
maskExc.ExceptWith(submask._inc);//удаляю конфликтующие ограничения maskExc.ExceptWith(submask._inc);//удаляю конфликтующие ограничения
maskInc.UnionWith(submask._inc); maskInc.UnionWith(submask._inc);
@ -169,30 +169,30 @@ namespace DCFApixels.DragonECS
#endregion #endregion
#region Iterator #region Iterator
public EcsSubjectIterator GetIterator() public EcsAspectIterator GetIterator()
{ {
return new EcsSubjectIterator(this, source.Entities); return new EcsAspectIterator(this, source.Entities);
} }
public EcsSubjectIterator GetIteratorFor(EcsReadonlyGroup sourceGroup) public EcsAspectIterator GetIteratorFor(EcsReadonlyGroup sourceGroup)
{ {
return new EcsSubjectIterator(this, sourceGroup); return new EcsAspectIterator(this, sourceGroup);
} }
#endregion #endregion
private struct CombinedSubject private struct Combined
{ {
public EcsSubject subject; public EcsAspect aspect;
public int order; public int order;
public CombinedSubject(EcsSubject subject, int order) public Combined(EcsAspect aspect, int order)
{ {
this.subject = subject; this.aspect = aspect;
this.order = order; this.order = order;
} }
} }
} }
#region BuilderBase #region BuilderBase
public abstract class EcsSubjectBuilderBase public abstract class EcsAspectBuilderBase
{ {
public abstract TPool Include<TPool>() where TPool : IEcsPoolImplementation, new(); public abstract TPool Include<TPool>() where TPool : IEcsPoolImplementation, new();
public abstract TPool Exclude<TPool>() where TPool : IEcsPoolImplementation, new(); public abstract TPool Exclude<TPool>() where TPool : IEcsPoolImplementation, new();
@ -291,15 +291,15 @@ namespace DCFApixels.DragonECS
#endregion #endregion
#region Iterator #region Iterator
public ref struct EcsSubjectIterator public ref struct EcsAspectIterator
{ {
public readonly EcsMask mask; public readonly EcsMask mask;
private EcsReadonlyGroup _sourceGroup; private EcsReadonlyGroup _sourceGroup;
private Enumerator _enumerator; private Enumerator _enumerator;
public EcsSubjectIterator(EcsSubject subject, EcsReadonlyGroup sourceGroup) public EcsAspectIterator(EcsAspect aspect, EcsReadonlyGroup sourceGroup)
{ {
mask = subject.mask; mask = aspect.mask;
_sourceGroup = sourceGroup; _sourceGroup = sourceGroup;
_enumerator = default; _enumerator = default;
} }

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2 fileFormatVersion: 2
guid: 29736b3a804309743ad63455ed8fa098 guid: 094f935216fa31840883f30e413d7f0c
MonoImporter: MonoImporter:
externalObjects: {} externalObjects: {}
serializedVersion: 2 serializedVersion: 2

View File

@ -312,7 +312,7 @@ namespace DCFApixels.DragonECS
} }
#region Extensions #region Extensions
public static class EcsPipelineExtensions public static partial class EcsPipelineExtensions
{ {
public static bool IsNullOrDestroyed(this EcsPipeline self) => self == null || self.IsDestoryed; public static bool IsNullOrDestroyed(this EcsPipeline self) => self == null || self.IsDestoryed;
public static EcsPipeline.Builder Add(this EcsPipeline.Builder self, IEnumerable<IEcsProcess> range, string layerName = null) public static EcsPipeline.Builder Add(this EcsPipeline.Builder self, IEnumerable<IEcsProcess> range, string layerName = null)

View File

@ -119,7 +119,7 @@ namespace DCFApixels.DragonECS
internal IEcsPoolImplementation[] _pools; internal IEcsPoolImplementation[] _pools;
private EcsNullPool _nullPool = EcsNullPool.instance; private EcsNullPool _nullPool = EcsNullPool.instance;
private EcsSubject[] _subjects; private EcsAspect[] _aspects;
private EcsQueryExecutor[] _executors; private EcsQueryExecutor[] _executors;
private List<WeakReference<EcsGroup>> _groups = new List<WeakReference<EcsGroup>>(); private List<WeakReference<EcsGroup>> _groups = new List<WeakReference<EcsGroup>>();
@ -166,7 +166,7 @@ namespace DCFApixels.DragonECS
_allEntites = GetFreeGroup(); _allEntites = GetFreeGroup();
_subjects = new EcsSubject[128]; _aspects = new EcsAspect[128];
_executors = new EcsQueryExecutor[128]; _executors = new EcsQueryExecutor[128];
} }
public void Destroy() public void Destroy()
@ -175,7 +175,7 @@ namespace DCFApixels.DragonECS
_gens = null; _gens = null;
_pools = null; _pools = null;
_nullPool = null; _nullPool = null;
_subjects = null; _aspects = null;
_executors = null; _executors = null;
Worlds[id] = null; Worlds[id] = null;
ReleaseData(id); ReleaseData(id);
@ -212,14 +212,14 @@ namespace DCFApixels.DragonECS
} }
return (TPool)_pools[index]; return (TPool)_pools[index];
} }
public TSubject GetSubject<TSubject>() where TSubject : EcsSubject public TAspect GetAspect<TAspect>() where TAspect : EcsAspect
{ {
int index = WorldMetaStorage.GetSubjectID<TSubject>(_worldTypeID); int index = WorldMetaStorage.GetAspectID<TAspect>(_worldTypeID);
if (index >= _subjects.Length) if (index >= _aspects.Length)
Array.Resize(ref _subjects, _subjects.Length << 1); Array.Resize(ref _aspects, _aspects.Length << 1);
if (_subjects[index] == null) if (_aspects[index] == null)
_subjects[index] = EcsSubject.Builder.Build<TSubject>(this); _aspects[index] = EcsAspect.Builder.Build<TAspect>(this);
return (TSubject)_subjects[index]; return (TAspect)_aspects[index];
} }
public TExecutor GetExecutor<TExecutor>() where TExecutor : EcsQueryExecutor, new() public TExecutor GetExecutor<TExecutor>() where TExecutor : EcsQueryExecutor, new()
{ {
@ -239,25 +239,25 @@ namespace DCFApixels.DragonECS
#endregion #endregion
#region Where Query #region Where Query
public EcsReadonlyGroup WhereFor<TSubject>(EcsReadonlyGroup sourceGroup, out TSubject subject) where TSubject : EcsSubject public EcsReadonlyGroup WhereFor<TAspect>(EcsReadonlyGroup sourceGroup, out TAspect aspect) where TAspect : EcsAspect
{ {
var executor = GetExecutor<EcsWhereExecutor<TSubject>>(); var executor = GetExecutor<EcsWhereExecutor<TAspect>>();
subject = executor.Subject; aspect = executor.Aspect;
return executor.ExecuteFor(sourceGroup); return executor.ExecuteFor(sourceGroup);
} }
public EcsReadonlyGroup WhereFor<TSubject>(EcsReadonlyGroup sourceGroup) where TSubject : EcsSubject public EcsReadonlyGroup WhereFor<TAspect>(EcsReadonlyGroup sourceGroup) where TAspect : EcsAspect
{ {
return GetExecutor<EcsWhereExecutor<TSubject>>().ExecuteFor(sourceGroup); return GetExecutor<EcsWhereExecutor<TAspect>>().ExecuteFor(sourceGroup);
} }
public EcsReadonlyGroup Where<TSubject>(out TSubject subject) where TSubject : EcsSubject public EcsReadonlyGroup Where<TAspect>(out TAspect aspect) where TAspect : EcsAspect
{ {
var executor = GetExecutor<EcsWhereExecutor<TSubject>>(); var executor = GetExecutor<EcsWhereExecutor<TAspect>>();
subject = executor.Subject; aspect = executor.Aspect;
return executor.Execute(); return executor.Execute();
} }
public EcsReadonlyGroup Where<TSubject>() where TSubject : EcsSubject public EcsReadonlyGroup Where<TAspect>() where TAspect : EcsAspect
{ {
return GetExecutor<EcsWhereExecutor<TSubject>>().Execute(); return GetExecutor<EcsWhereExecutor<TAspect>>().Execute();
} }
#endregion #endregion

View File

@ -1,8 +1,8 @@
namespace DCFApixels.DragonECS namespace DCFApixels.DragonECS
{ {
public sealed class EcsWhereExecutor<TSubject> : EcsQueryExecutor where TSubject : EcsSubject public sealed class EcsWhereExecutor<TAspect> : EcsQueryExecutor where TAspect : EcsAspect
{ {
private TSubject _subject; private TAspect _aspect;
private EcsGroup _filteredGroup; private EcsGroup _filteredGroup;
private long _executeVersion; private long _executeVersion;
@ -12,14 +12,14 @@
#endif #endif
#region Properties #region Properties
public TSubject Subject => _subject; public TAspect Aspect => _aspect;
internal long ExecuteVersion => _executeVersion; internal long ExecuteVersion => _executeVersion;
#endregion #endregion
#region OnInitialize/OnDestroy #region OnInitialize/OnDestroy
protected sealed override void OnInitialize() protected sealed override void OnInitialize()
{ {
_subject = World.GetSubject<TSubject>(); _aspect = World.GetAspect<TAspect>();
_filteredGroup = EcsGroup.New(World); _filteredGroup = EcsGroup.New(World);
} }
protected sealed override void OnDestroy() protected sealed override void OnDestroy()
@ -29,14 +29,14 @@
#endregion #endregion
#region Methods #region Methods
public EcsReadonlyGroup Execute() => ExecuteFor(_subject.World.Entities); public EcsReadonlyGroup Execute() => ExecuteFor(_aspect.World.Entities);
public EcsReadonlyGroup ExecuteFor(EcsReadonlyGroup sourceGroup) public EcsReadonlyGroup ExecuteFor(EcsReadonlyGroup sourceGroup)
{ {
#if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS #if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS
_executeWhere.Begin(); _executeWhere.Begin();
if (sourceGroup.IsNull) throw new System.ArgumentNullException();//TODO составить текст исключения. if (sourceGroup.IsNull) throw new System.ArgumentNullException();//TODO составить текст исключения.
#endif #endif
_subject.GetIteratorFor(sourceGroup).CopyTo(_filteredGroup); _aspect.GetIteratorFor(sourceGroup).CopyTo(_filteredGroup);
#if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS #if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS
_executeWhere.End(); _executeWhere.End();
#endif #endif

View File

@ -202,15 +202,15 @@ namespace DCFApixels.DragonECS
return self.GetPool<EcsPool<TComponent>>(); return self.GetPool<EcsPool<TComponent>>();
} }
public static EcsPool<TComponent> Include<TComponent>(this EcsSubjectBuilderBase self) where TComponent : struct, IEcsComponent public static EcsPool<TComponent> Include<TComponent>(this EcsAspectBuilderBase self) where TComponent : struct, IEcsComponent
{ {
return self.Include<EcsPool<TComponent>>(); return self.Include<EcsPool<TComponent>>();
} }
public static EcsPool<TComponent> Exclude<TComponent>(this EcsSubjectBuilderBase self) where TComponent : struct, IEcsComponent public static EcsPool<TComponent> Exclude<TComponent>(this EcsAspectBuilderBase self) where TComponent : struct, IEcsComponent
{ {
return self.Exclude<EcsPool<TComponent>>(); return self.Exclude<EcsPool<TComponent>>();
} }
public static EcsPool<TComponent> Optional<TComponent>(this EcsSubjectBuilderBase self) where TComponent : struct, IEcsComponent public static EcsPool<TComponent> Optional<TComponent>(this EcsAspectBuilderBase self) where TComponent : struct, IEcsComponent
{ {
return self.Optional<EcsPool<TComponent>>(); return self.Optional<EcsPool<TComponent>>();
} }

View File

@ -194,15 +194,15 @@ namespace DCFApixels.DragonECS
return self.GetPool<EcsTagPool<TTagComponent>>(); return self.GetPool<EcsTagPool<TTagComponent>>();
} }
public static EcsTagPool<TTagComponent> Include<TTagComponent>(this EcsSubjectBuilderBase self) where TTagComponent : struct, IEcsTagComponent public static EcsTagPool<TTagComponent> Include<TTagComponent>(this EcsAspectBuilderBase self) where TTagComponent : struct, IEcsTagComponent
{ {
return self.Include<EcsTagPool<TTagComponent>>(); return self.Include<EcsTagPool<TTagComponent>>();
} }
public static EcsTagPool<TTagComponent> Exclude<TTagComponent>(this EcsSubjectBuilderBase self) where TTagComponent : struct, IEcsTagComponent public static EcsTagPool<TTagComponent> Exclude<TTagComponent>(this EcsAspectBuilderBase self) where TTagComponent : struct, IEcsTagComponent
{ {
return self.Exclude<EcsTagPool<TTagComponent>>(); return self.Exclude<EcsTagPool<TTagComponent>>();
} }
public static EcsTagPool<TTagComponent> Optional<TTagComponent>(this EcsSubjectBuilderBase self) where TTagComponent : struct, IEcsTagComponent public static EcsTagPool<TTagComponent> Optional<TTagComponent>(this EcsAspectBuilderBase self) where TTagComponent : struct, IEcsTagComponent
{ {
return self.Optional<EcsTagPool<TTagComponent>>(); return self.Optional<EcsTagPool<TTagComponent>>();
} }

View File

@ -49,7 +49,7 @@ namespace DCFApixels.DragonECS
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int GetPoolID<T>(int worldID) => Pool<T>.Get(worldID); public static int GetPoolID<T>(int worldID) => Pool<T>.Get(worldID);
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int GetSubjectID<T>(int worldID) => Subject<T>.Get(worldID); public static int GetAspectID<T>(int worldID) => Aspect<T>.Get(worldID);
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int GetExecutorID<T>(int worldID) => Executor<T>.Get(worldID); public static int GetExecutorID<T>(int worldID) => Executor<T>.Get(worldID);
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
@ -159,10 +159,10 @@ namespace DCFApixels.DragonECS
} }
} }
} }
private static class Subject<T> private static class Aspect<T>
{ {
public static int[] ids; public static int[] ids;
static Subject() static Aspect()
{ {
ids = new int[_tokenCount]; ids = new int[_tokenCount];
for (int i = 0; i < ids.Length; i++) for (int i = 0; i < ids.Length; i++)
@ -174,7 +174,7 @@ namespace DCFApixels.DragonECS
{ {
ref int id = ref ids[token]; ref int id = ref ids[token];
if (id < 0) if (id < 0)
id = _metas[token].subjectsCount++; id = _metas[token].aspectsCount++;
return id; return id;
} }
private sealed class Resizer : ResizerBase private sealed class Resizer : ResizerBase
@ -255,7 +255,7 @@ namespace DCFApixels.DragonECS
public readonly Type worldType; public readonly Type worldType;
public int id; public int id;
public int componentCount; public int componentCount;
public int subjectsCount; public int aspectsCount;
public int executorsCount; public int executorsCount;
public int worldComponentCount; public int worldComponentCount;
private Type[] _types = new Type[10]; private Type[] _types = new Type[10];