fix filter fbug

This commit is contained in:
Mikhail 2023-04-21 16:03:50 +08:00
parent 699a64f0b6
commit e2371103c1
14 changed files with 188 additions and 131 deletions

View File

@ -1,30 +0,0 @@
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
namespace DCFApixels.DragonECS
{
/// <summary>
/// Используется для реализации отношений. traget - это сущьность к которой крепится эта сущьность. other - это сущьность с которой traget образует связь
/// </summary>
[StructLayout(LayoutKind.Explicit, Pack = 8, Size = 16)]
public readonly struct Edge
{
[FieldOffset(0), MarshalAs(UnmanagedType.U8)]
public readonly EcsEntity origin;
[FieldOffset(1), MarshalAs(UnmanagedType.U8)]
public readonly EcsEntity other;
/// <summary>alias for "origin"</summary>
public EcsEntity left
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get => origin;
}
/// <summary>alias for "other"</summary>
public EcsEntity right
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
get => other;
}
}
}

View File

@ -52,7 +52,7 @@ namespace DCFApixels.DragonECS
public void Inject(T obj); public void Inject(T obj);
} }
[DebugHide, DebugColor(DebugColor.Gray)] [DebugHide, DebugColor(DebugColor.Gray)]
public sealed class InjectRunner<T> : EcsRunner<IEcsInject<T>>, IEcsInject<T> public sealed class InjectRunner<T> : EcsRunner<IEcsInject<T>>, IEcsInject<T>
{ {
private IEcsPreInject _preInjectchache; private IEcsPreInject _preInjectchache;

View File

@ -11,8 +11,8 @@
{ {
public EcsDefaultWrold(EcsPipeline pipeline = null) : base(pipeline) { } public EcsDefaultWrold(EcsPipeline pipeline = null) : base(pipeline) { }
} }
public sealed class EcsEventWrold : EcsEdgeWorld<EcsEventWrold> public sealed class EcsEventWrold : EcsWorld<EcsEventWrold>
{ {
public EcsEventWrold(EcsWorld firstTarget, EcsWorld secondTarget, EcsPipeline pipeline = null) : base(firstTarget, secondTarget, pipeline) { } public EcsEventWrold(EcsPipeline pipeline = null) : base(pipeline) { }
} }
} }

View File

@ -1,23 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DCFApixels.DragonECS
{
public class EcsEdgeWorld<TWorldArchetype> : EcsWorld<TWorldArchetype> where TWorldArchetype : EcsWorld<TWorldArchetype>
{
private EcsWorld _firstTarget;
private EcsWorld _secondTarget;
public EcsEdgeWorld(EcsWorld firstTarget, EcsWorld secondTarget, EcsPipeline pipeline) : base(pipeline)
{
_firstTarget = firstTarget;
_secondTarget = secondTarget;
}
public EcsEdgeWorld(EcsWorld firstTarget, EcsPipeline pipeline) : base(pipeline)
{
_firstTarget = firstTarget;
}
}
}

83
src/EcsJoinQuery.cs Normal file
View File

@ -0,0 +1,83 @@
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Runtime.CompilerServices;
using Unity.Profiling;
namespace DCFApixels.DragonECS
{
public abstract class EcsJoinQueryBase : EcsQueryBase
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
protected void ExecuteWhere()
{
var pools = World.GetAllPools();
EcsReadonlyGroup all = World.Entities;
groupFilter.Clear();
foreach (var e in all)
{
int entityID = e.id;
for (int i = 0, iMax = mask.Inc.Length; i < iMax; i++)
{
if (!pools[mask.Inc[i]].Has(entityID))
goto next;
}
for (int i = 0, iMax = mask.Exc.Length; i < iMax; i++)
{
if (pools[mask.Exc[i]].Has(entityID))
goto next;
}
groupFilter.AggressiveAdd(entityID);
next: continue;
}
groupFilter.Sort();
}
}
public abstract class EcsJoinAttachQuery<TAttachComponent> : EcsJoinQueryBase
where TAttachComponent : struct, IEcsAttachComponent
{
private EcsWorld _targetWorld;
private EcsAttachPool<TAttachComponent> _targetPool;
private ProfilerMarker _execute = new ProfilerMarker("EcsJoinAttachQuery.Execute");
protected sealed override void OnBuild(Builder b)
{
_targetPool = b.Include<TAttachComponent>();
}
public sealed override void Execute()
{
using (_execute.Auto())
{
ExecuteWhere();
}
}
public EcsGroup.Enumerator GetEnumerator()
{
return groupFilter.GetEnumerator();
}
}
public abstract class EcsJoinRelationQuery<TRelationComponent> : EcsJoinQueryBase
where TRelationComponent : struct, IEcsRelationComponent
{
private EcsWorld _firstWorld;
private EcsWorld _secondWorld;
private EcsRelationPool<TRelationComponent> _targetPool;
private ProfilerMarker _execute = new ProfilerMarker("EcsJoinRelationQuery.Execute");
protected sealed override void OnBuild(Builder b)
{
_targetPool = source.GetPool<TRelationComponent>();
}
public sealed override void Execute()
{
using (_execute.Auto())
{
ExecuteWhere();
}
}
public EcsGroup.Enumerator GetEnumerator()
{
return groupFilter.GetEnumerator();
}
}
}

View File

@ -14,7 +14,7 @@ namespace DCFApixels.DragonECS
#region Builder #region Builder
protected virtual void Init(Builder b) { } protected virtual void Init(Builder b) { }
protected abstract void OnBuildAfter(); protected abstract void OnBuild(Builder b);
public abstract void Execute(); public abstract void Execute();
public sealed class Builder : EcsQueryBuilderBase public sealed class Builder : EcsQueryBuilderBase
{ {
@ -45,8 +45,8 @@ namespace DCFApixels.DragonECS
} }
newQuery.groupFilter = EcsGroup.New(world); newQuery.groupFilter = EcsGroup.New(world);
newQuery.source = world; newQuery.source = world;
newQuery.OnBuild(builder);
builder.End(out newQuery.mask); builder.End(out newQuery.mask);
newQuery.OnBuildAfter();
return (TQuery)(object)newQuery; return (TQuery)(object)newQuery;
} }
@ -77,61 +77,16 @@ namespace DCFApixels.DragonECS
} }
#endregion #endregion
} }
public abstract class EcsJoinAttachQuery : EcsQueryBase
{
// private EcsPool<Edge> attachPool;
private ProfilerMarker _getEnumerator = new ProfilerMarker("EcsJoinAttachQuery.Execute");
protected sealed override void OnBuildAfter()
{
throw new NotImplementedException();
// attachPool = World.GetPool<Edge>();
}
public sealed override void Execute()
{
using (_getEnumerator.Auto())
{
throw new NotImplementedException();
}
}
public EcsGroup.Enumerator GetEnumerator()
{
return groupFilter.GetEnumerator();
}
}
public abstract class EcsJoinRelationQuery : EcsQueryBase
{
// private EcsPool<Edge> attachPool;
private ProfilerMarker _getEnumerator = new ProfilerMarker("EcsJoinAttachQuery.Execute");
protected sealed override void OnBuildAfter()
{
throw new NotImplementedException();
// attachPool = World.GetPool<Edge>();
}
public sealed override void Execute()
{
using (_getEnumerator.Auto())
{
throw new NotImplementedException();
}
}
public EcsGroup.Enumerator GetEnumerator()
{
return groupFilter.GetEnumerator();
}
}
public abstract class EcsQuery : EcsQueryBase public abstract class EcsQuery : EcsQueryBase
{ {
private ProfilerMarker _getEnumerator = new ProfilerMarker("EcsQuery.Execute"); private ProfilerMarker _execute = new ProfilerMarker("EcsQuery.Execute");
protected sealed override void OnBuildAfter() { } protected sealed override void OnBuild(Builder b) { }
public sealed override void Execute() public sealed override void Execute()
{ {
using (_getEnumerator.Auto()) using (_execute.Auto())
{ {
var pools = World.GetAllPools(); var pools = World.GetAllPools();
EcsReadonlyGroup all = World.Entities; EcsReadonlyGroup all = World.Entities;
groupFilter.Clear(); groupFilter.Clear();
foreach (var e in all) foreach (var e in all)
@ -140,14 +95,15 @@ namespace DCFApixels.DragonECS
for (int i = 0, iMax = mask.Inc.Length; i < iMax; i++) for (int i = 0, iMax = mask.Inc.Length; i < iMax; i++)
{ {
if (!pools[mask.Inc[i]].Has(entityID)) if (!pools[mask.Inc[i]].Has(entityID))
continue; goto next;
} }
for (int i = 0, iMax = mask.Exc.Length; i < iMax; i++) for (int i = 0, iMax = mask.Exc.Length; i < iMax; i++)
{ {
if (pools[mask.Exc[i]].Has(entityID)) if (pools[mask.Exc[i]].Has(entityID))
continue; goto next;
} }
groupFilter.AggressiveAdd(entityID); groupFilter.AggressiveAdd(entityID);
next: continue;
} }
groupFilter.Sort(); groupFilter.Sort();
} }

View File

@ -146,7 +146,7 @@ namespace DCFApixels.DragonECS
#endregion #endregion
#region Queries #region Queries
public TQuery Where<TQuery>(out TQuery query) where TQuery : EcsQueryBase public TQuery Where<TQuery>(out TQuery query) where TQuery : EcsQuery
{ {
query = Select<TQuery>(); query = Select<TQuery>();
query.Execute(); query.Execute();

View File

@ -19,7 +19,7 @@ namespace DCFApixels.DragonECS
public ReadOnlySpan<EcsPoolBase> GetAllPools(); public ReadOnlySpan<EcsPoolBase> GetAllPools();
public TQuery Select<TQuery>() where TQuery : EcsQueryBase; public TQuery Select<TQuery>() where TQuery : EcsQueryBase;
public TQuery Where<TQuery>(out TQuery query) where TQuery : EcsQuery; public TQuery Where<TQuery>(out TQuery query) where TQuery : EcsQuery;
public TQuery Join<TQuery>(out TQuery query) where TQuery : EcsJoinAttachQuery; // public TQuery Join<TQuery>(out TQuery query) where TQuery : EcsJoinQueryBase;
public bool IsMaskCompatible(EcsComponentMask mask, int entityID); public bool IsMaskCompatible(EcsComponentMask mask, int entityID);

View File

@ -30,12 +30,11 @@ namespace DCFApixels.DragonECS
protected override void Init(EcsWorld world) protected override void Init(EcsWorld world)
{ {
_source = world; _source = world;
_poolRunners = new PoolRunners(world.Pipeline);
_entityFlags = new bool[world.Capacity]; _entityFlags = new bool[world.Capacity];
_items = new T[world.Capacity]; _items = new T[world.Capacity];
_count = 0; _count = 0;
_poolRunners = new PoolRunners(world.Pipeline);
} }
#endregion #endregion
@ -118,10 +117,22 @@ namespace DCFApixels.DragonECS
} }
public static class EcsAttachComponentPoolExt public static class EcsAttachComponentPoolExt
{ {
public static EcsAttachPool<TAttachComponent> GetPool<TAttachComponent>(this EcsWorld self) public static EcsAttachPool<TAttachComponent> GetPool<TAttachComponent>(this EcsWorld self) where TAttachComponent : struct, IEcsAttachComponent
where TAttachComponent : struct, IEcsAttachComponent
{ {
return self.GetPool<TAttachComponent, EcsAttachPool<TAttachComponent>>(); return self.GetPool<TAttachComponent, EcsAttachPool<TAttachComponent>>();
} }
public static EcsAttachPool<TAttachComponent> Include<TAttachComponent>(this EcsQueryBuilderBase self) where TAttachComponent : struct, IEcsAttachComponent
{
return self.Include<TAttachComponent, EcsAttachPool<TAttachComponent>>();
}
public static EcsAttachPool<TAttachComponent> Exclude<TAttachComponent>(this EcsQueryBuilderBase self) where TAttachComponent : struct, IEcsAttachComponent
{
return self.Exclude<TAttachComponent, EcsAttachPool<TAttachComponent>>();
}
public static EcsAttachPool<TAttachComponent> Optional<TAttachComponent>(this EcsQueryBuilderBase self) where TAttachComponent : struct, IEcsAttachComponent
{
return self.Optional<TAttachComponent, EcsAttachPool<TAttachComponent>>();
}
} }
} }

View File

@ -74,10 +74,22 @@ namespace DCFApixels.DragonECS
public interface INotNullComponent { } public interface INotNullComponent { }
public static class EcsNotNullPoolExt public static class EcsNotNullPoolExt
{ {
public static EcsNotNullPool<TNotNullComponent> GetPool<TNotNullComponent>(this EcsWorld self) public static EcsNotNullPool<TNotNullComponent> GetPool<TNotNullComponent>(this EcsWorld self) where TNotNullComponent : struct, INotNullComponent
where TNotNullComponent : struct, INotNullComponent
{ {
return self.GetPool<TNotNullComponent, EcsNotNullPool<TNotNullComponent>>(); return self.GetPool<TNotNullComponent, EcsNotNullPool<TNotNullComponent>>();
} }
public static EcsNotNullPool<TNotNullComponent> Include<TNotNullComponent>(this EcsQueryBuilderBase self) where TNotNullComponent : struct, INotNullComponent
{
return self.Include<TNotNullComponent, EcsNotNullPool<TNotNullComponent>>();
}
public static EcsNotNullPool<TNotNullComponent> Exclude<TNotNullComponent>(this EcsQueryBuilderBase self) where TNotNullComponent : struct, INotNullComponent
{
return self.Exclude<TNotNullComponent, EcsNotNullPool<TNotNullComponent>>();
}
public static EcsNotNullPool<TNotNullComponent> Optional<TNotNullComponent>(this EcsQueryBuilderBase self) where TNotNullComponent : struct, INotNullComponent
{
return self.Optional<TNotNullComponent, EcsNotNullPool<TNotNullComponent>>();
}
} }
} }

View File

@ -112,7 +112,7 @@ namespace DCFApixels.DragonECS
Array.Resize(ref _items, _items.Length << 1); Array.Resize(ref _items, _items.Length << 1);
} }
_mapping[entityID] = itemIndex; //_mapping[entityID] = itemIndex; TODO ïðîâåðèòü ÷òî ýòî ëèøíåå äåéñâèå
_poolRunners.add.OnComponentAdd<T>(entityID); _poolRunners.add.OnComponentAdd<T>(entityID);
} }
_poolRunners.write.OnComponentWrite<T>(entityID); _poolRunners.write.OnComponentWrite<T>(entityID);
@ -166,10 +166,22 @@ namespace DCFApixels.DragonECS
public interface IEcsComponent { } public interface IEcsComponent { }
public static class EcsPoolExt public static class EcsPoolExt
{ {
public static EcsPool<TComponent> GetPool<TComponent>(this EcsWorld self) public static EcsPool<TComponent> GetPool<TComponent>(this EcsWorld self) where TComponent : struct, IEcsComponent
where TComponent : struct, IEcsComponent
{ {
return self.GetPool<TComponent, EcsPool<TComponent>>(); return self.GetPool<TComponent, EcsPool<TComponent>>();
} }
public static EcsPool<TComponent> Include<TComponent>(this EcsQueryBuilderBase self) where TComponent : struct, IEcsComponent
{
return self.Include<TComponent, EcsPool<TComponent>>();
}
public static EcsPool<TComponent> Exclude<TComponent>(this EcsQueryBuilderBase self) where TComponent : struct, IEcsComponent
{
return self.Exclude<TComponent, EcsPool<TComponent>>();
}
public static EcsPool<TComponent> Optional<TComponent>(this EcsQueryBuilderBase self) where TComponent : struct, IEcsComponent
{
return self.Optional<TComponent, EcsPool<TComponent>>();
}
} }
} }

View File

@ -31,12 +31,11 @@ namespace DCFApixels.DragonECS
protected override void Init(EcsWorld world) protected override void Init(EcsWorld world)
{ {
_source = world; _source = world;
_poolRunners = new PoolRunners(world.Pipeline);
_entityFlags = new bool[world.Capacity]; _entityFlags = new bool[world.Capacity];
_items = new T[world.Capacity]; _items = new T[world.Capacity];
_count = 0; _count = 0;
_poolRunners = new PoolRunners(world.Pipeline);
} }
#endregion #endregion
@ -125,10 +124,22 @@ namespace DCFApixels.DragonECS
} }
public static class EcsRelationPoolExt public static class EcsRelationPoolExt
{ {
public static EcsRelationPool<TRelationComponent> GetPool<TRelationComponent>(this EcsWorld self) public static EcsRelationPool<TRelationComponent> GetPool<TRelationComponent>(this EcsWorld self) where TRelationComponent : struct, IEcsRelationComponent
where TRelationComponent : struct, IEcsRelationComponent
{ {
return self.GetPool<TRelationComponent, EcsRelationPool<TRelationComponent>>(); return self.GetPool<TRelationComponent, EcsRelationPool<TRelationComponent>>();
} }
public static EcsRelationPool<TRelationComponent> Include<TRelationComponent>(this EcsQueryBuilderBase self) where TRelationComponent : struct, IEcsRelationComponent
{
return self.Include<TRelationComponent, EcsRelationPool<TRelationComponent>>();
}
public static EcsRelationPool<TRelationComponent> Exclude<TRelationComponent>(this EcsQueryBuilderBase self) where TRelationComponent : struct, IEcsRelationComponent
{
return self.Exclude<TRelationComponent, EcsRelationPool<TRelationComponent>>();
}
public static EcsRelationPool<TRelationComponent> Optional<TRelationComponent>(this EcsQueryBuilderBase self) where TRelationComponent : struct, IEcsRelationComponent
{
return self.Optional<TRelationComponent, EcsRelationPool<TRelationComponent>>();
}
} }
} }

View File

@ -100,6 +100,19 @@ namespace DCFApixels.DragonECS
where TSingleComponent : struct, IEcsSingleComponent where TSingleComponent : struct, IEcsSingleComponent
{ {
return self.GetPool<TSingleComponent, EcsSinglePool<TSingleComponent>>(); return self.GetPool<TSingleComponent, EcsSinglePool<TSingleComponent>>();
} }
public static EcsSinglePool<TSingleComponent> Include<TSingleComponent>(this EcsQueryBuilderBase self) where TSingleComponent : struct, IEcsSingleComponent
{
return self.Include<TSingleComponent, EcsSinglePool<TSingleComponent>>();
}
public static EcsSinglePool<TSingleComponent> Exclude<TSingleComponent>(this EcsQueryBuilderBase self) where TSingleComponent : struct, IEcsSingleComponent
{
return self.Exclude<TSingleComponent, EcsSinglePool<TSingleComponent>>();
}
public static EcsSinglePool<TSingleComponent> Optional<TSingleComponent>(this EcsQueryBuilderBase self) where TSingleComponent : struct, IEcsSingleComponent
{
return self.Optional<TSingleComponent, EcsSinglePool<TSingleComponent>>();
}
} }
} }

View File

@ -77,10 +77,22 @@ namespace DCFApixels.DragonECS
public interface IEcsTagComponent { } public interface IEcsTagComponent { }
public static class EcsTagPoolExt public static class EcsTagPoolExt
{ {
public static EcsTagPool<TTagComponent> GetPool<TTagComponent>(this EcsWorld self) public static EcsTagPool<TTagComponent> GetPool<TTagComponent>(this EcsWorld self) where TTagComponent : struct, IEcsTagComponent
where TTagComponent : struct, IEcsTagComponent
{ {
return self.GetPool<TTagComponent, EcsTagPool<TTagComponent>>(); return self.GetPool<TTagComponent, EcsTagPool<TTagComponent>>();
} }
public static EcsTagPool<TTagComponent> Include<TTagComponent>(this EcsQueryBuilderBase self) where TTagComponent : struct, IEcsTagComponent
{
return self.Include<TTagComponent, EcsTagPool<TTagComponent>>();
}
public static EcsTagPool<TTagComponent> Exclude<TTagComponent>(this EcsQueryBuilderBase self) where TTagComponent : struct, IEcsTagComponent
{
return self.Exclude<TTagComponent, EcsTagPool<TTagComponent>>();
}
public static EcsTagPool<TTagComponent> Optional<TTagComponent>(this EcsQueryBuilderBase self) where TTagComponent : struct, IEcsTagComponent
{
return self.Optional<TTagComponent, EcsTagPool<TTagComponent>>();
}
} }
} }