diff --git a/src/Builtin/Worlds.cs b/src/Builtin/Worlds.cs index 5f50cfb..75e5e4d 100644 --- a/src/Builtin/Worlds.cs +++ b/src/Builtin/Worlds.cs @@ -13,9 +13,10 @@ namespace DCFApixels.DragonECS [MetaID("DragonECS_4EE3527C92015BAB0299CB7B4E2663D1")] public sealed class EcsDefaultWorld : EcsWorld, IInjectionUnit { - public EcsDefaultWorld() : base() { } - public EcsDefaultWorld(EcsWorldConfig config = null, string name = null, short worldID = -1) : base(config, name == null ? "Default" : name, worldID) { } - public EcsDefaultWorld(IConfigContainer configs, string name = null, short worldID = -1) : base(configs, name == null ? "Default" : name, worldID) { } + private const string DEFAULT_NAME = "Default"; + public EcsDefaultWorld() : base(default(EcsWorldConfig), DEFAULT_NAME) { } + public EcsDefaultWorld(EcsWorldConfig config = null, string name = null, short worldID = -1) : base(config, name == null ? DEFAULT_NAME : name, worldID) { } + public EcsDefaultWorld(IConfigContainer configs, string name = null, short worldID = -1) : base(configs, name == null ? DEFAULT_NAME : name, worldID) { } void IInjectionUnit.InitInjectionNode(InjectionGraph nodes) { nodes.AddNode(this); } } /// EcsWrold for store event entities. @@ -26,9 +27,10 @@ namespace DCFApixels.DragonECS [MetaID("DragonECS_D7CE527C920160BCD765EFA72DBF8B89")] public sealed class EcsEventWorld : EcsWorld, IInjectionUnit { - public EcsEventWorld() : base() { } - public EcsEventWorld(EcsWorldConfig config = null, string name = null, short worldID = -1) : base(config, name == null ? "Events" : name, worldID) { } - public EcsEventWorld(IConfigContainer configs, string name = null, short worldID = -1) : base(configs, name == null ? "Events" : name, worldID) { } + private const string DEFAULT_NAME = "Events"; + public EcsEventWorld() : base(default(EcsWorldConfig), DEFAULT_NAME) { } + public EcsEventWorld(EcsWorldConfig config = null, string name = null, short worldID = -1) : base(config, name == null ? DEFAULT_NAME : name, worldID) { } + public EcsEventWorld(IConfigContainer configs, string name = null, short worldID = -1) : base(configs, name == null ? DEFAULT_NAME : name, worldID) { } void IInjectionUnit.InitInjectionNode(InjectionGraph nodes) { nodes.AddNode(this); } } } diff --git a/src/EcsWorld.cs b/src/EcsWorld.cs index 6ed6fe3..a07e9ab 100644 --- a/src/EcsWorld.cs +++ b/src/EcsWorld.cs @@ -257,6 +257,38 @@ namespace DCFApixels.DragonECS { return Get>().Instance; } + public void GetAspects(out TAspect0 a0) + where TAspect0 : new() + { + a0 = GetAspect(); + } + public void GetAspects(out TAspect0 a0, out TAspect1 a1) + where TAspect0 : new() + where TAspect1 : new() + { + a0 = GetAspect(); + a1 = GetAspect(); + } + public void GetAspects(out TAspect0 a0, out TAspect1 a1, out TAspect2 a2) + where TAspect0 : new() + where TAspect1 : new() + where TAspect2 : new() + { + a0 = GetAspect(); + a1 = GetAspect(); + a2 = GetAspect(); + } + public void GetAspects(out TAspect0 a0, out TAspect1 a1, out TAspect2 a2, out TAspect3 a3) + where TAspect0 : new() + where TAspect1 : new() + where TAspect2 : new() + where TAspect3 : new() + { + a0 = GetAspect(); + a1 = GetAspect(); + a2 = GetAspect(); + a3 = GetAspect(); + } [MethodImpl(MethodImplOptions.AggressiveInlining)] public TAspect GetAspect(out EcsMask mask) where TAspect : new() { @@ -1185,6 +1217,7 @@ namespace DCFApixels.DragonECS { private EcsWorld _world; private List _queries; + public string Name { get { return _world.Name; } } public EntitySlotInfo[] Entities { get diff --git a/src/Executors/EcsWhereToGroupExecutor.cs b/src/Executors/EcsWhereToGroupExecutor.cs index 7765503..8d57c6e 100644 --- a/src/Executors/EcsWhereToGroupExecutor.cs +++ b/src/Executors/EcsWhereToGroupExecutor.cs @@ -68,6 +68,24 @@ namespace DCFApixels.DragonECS.Internal { _version++; _iterator.IterateTo(World.Entities, _filteredAllGroup); +#if DEBUG && DRAGONECS_DEEP_DEBUG + if(_filteredGroup == null) + { + _filteredGroup = EcsGroup.New(World); + } + _filteredGroup.Clear(); + foreach (var e in World.Entities) + { + if(World.IsMatchesMask(Mask, e)) + { + _filteredGroup.Add(e); + } + } + if(_filteredAllGroup.SetEquals(_filteredGroup) == false) + { + throw new System.InvalidOperationException(); + } +#endif } } [MethodImpl(MethodImplOptions.AggressiveInlining)] diff --git a/src/Executors/MaskQueryExecutor.cs b/src/Executors/MaskQueryExecutor.cs index de96a69..849b8ed 100644 --- a/src/Executors/MaskQueryExecutor.cs +++ b/src/Executors/MaskQueryExecutor.cs @@ -158,17 +158,17 @@ namespace DCFApixels.DragonECS.Core { *_versions = _world.Version; - long* ptr = _versions; + long* versionsPtr = _versions; var slots = _world._poolSlots; foreach (var slotIndex in _maskInc) { - ptr++; - *ptr = slots[slotIndex].version; + versionsPtr++; + *versionsPtr = slots[slotIndex].version; } foreach (var slotIndex in _maskExc) { - ptr++; - *ptr = slots[slotIndex].version; + versionsPtr++; + *versionsPtr = slots[slotIndex].version; } } public bool CheckAndNext() @@ -179,26 +179,28 @@ namespace DCFApixels.DragonECS.Core } *_versions = _world.Version; - long* ptr = _versions; + long* versionsPtr = _versions; var slots = _world._poolSlots; bool result = _count != 1; foreach (var slotIndex in _maskInc) { - ptr++; - if (*ptr != slots[slotIndex].version) + versionsPtr++; + if (*versionsPtr != slots[slotIndex].version) { result = false; - *ptr = slots[slotIndex].version; + *versionsPtr = slots[slotIndex].version; } } foreach (var slotIndex in _maskExc) { - ptr++; - if (*ptr != slots[slotIndex].version) - { - result = false; - *ptr = slots[slotIndex].version; - } + return false; //TODO hotfix, не правильная логика проверки версия для EXC, потому сейчас она скипается + + //versionsPtr++; + //if (*versionsPtr != slots[slotIndex].version) + //{ + // result = false; + // *versionsPtr = slots[slotIndex].version; + //} } return result; }