Compare commits

..

No commits in common. "main" and "0.3.2" have entirely different histories.
main ... 0.3.2

17 changed files with 35 additions and 148 deletions

1
.gitignore vendored
View File

@ -35,7 +35,6 @@ ExportedObj/
*.csproj *.csproj
*.unityproj *.unityproj
*.sln *.sln
*.sln.meta
*.suo *.suo
*.tmp *.tmp
*.user *.user

View File

View File

@ -8,7 +8,7 @@
"displayName": "DragonECS-Graphs", "displayName": "DragonECS-Graphs",
"description": "Entity Graphs for DragonECS", "description": "Entity Graphs for DragonECS",
"unity": "2020.3", "unity": "2020.3",
"version": "0.3.5", "version": "0.3.2",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/DCFApixels/DragonECS-Graphs.git" "url": "https://github.com/DCFApixels/DragonECS-Graphs.git"

View File

@ -7,21 +7,12 @@ namespace DCFApixels.DragonECS
[MetaGroup(EcsConsts.PACK_GROUP, EcsConsts.WORLDS_GROUP)] [MetaGroup(EcsConsts.PACK_GROUP, EcsConsts.WORLDS_GROUP)]
[MetaDescription(EcsConsts.AUTHOR, "Inherits EcsWorld without extending its functionality and is used for specific injections. Can be used as argument to EcsWorld.CreateGraph(new " + nameof(EcsGraphWorld) + "()) and to store relation entity.")] [MetaDescription(EcsConsts.AUTHOR, "Inherits EcsWorld without extending its functionality and is used for specific injections. Can be used as argument to EcsWorld.CreateGraph(new " + nameof(EcsGraphWorld) + "()) and to store relation entity.")]
[DebuggerTypeProxy(typeof(DebuggerProxy))] [DebuggerTypeProxy(typeof(DebuggerProxy))]
[MetaID("DragonECS_ECC4CF479301897718600925B00A7DB4")] [MetaID("ECC4CF479301897718600925B00A7DB4")]
public sealed class EcsGraphWorld : EcsWorld, IInjectionUnit, IInjectionBlock public sealed class EcsGraphWorld : EcsWorld, IInjectionUnit
{ {
private const string DEFAULT_NAME = "Graph"; public EcsGraphWorld() : base() { }
public EcsGraphWorld() : base(default(EcsWorldConfig), DEFAULT_NAME) { } public EcsGraphWorld(EcsWorldConfig config = null, string name = null, short worldID = -1) : base(config, name == null ? "Default" : name, worldID) { }
public EcsGraphWorld(EcsWorldConfig config = null, string name = null, short worldID = -1) : base(config, name == null ? DEFAULT_NAME : name, worldID) { } public EcsGraphWorld(IConfigContainer configs, string name = null, short worldID = -1) : base(configs, name == null ? "Default" : name, worldID) { }
public EcsGraphWorld(IConfigContainer configs, string name = null, short worldID = -1) : base(configs, name == null ? DEFAULT_NAME : name, worldID) { } void IInjectionUnit.InitInjectionNode(InjectionGraph nodes) { nodes.AddNode(this); }
void IInjectionUnit.InitInjectionNode(InjectionGraph nodes)
{
nodes.AddNode(this);
nodes.AddNode<EntityGraph>();
}
public void InjectTo(Injector inj)
{
inj.Inject(this.GetGraph());
}
} }
} }

View File

@ -1,8 +1,4 @@
#if DISABLE_DEBUG using DCFApixels.DragonECS.Graphs.Internal;
#undef DEBUG
#endif
using DCFApixels.DragonECS.Core;
using DCFApixels.DragonECS.Graphs.Internal;
using System; using System;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
@ -88,32 +84,14 @@ namespace DCFApixels.DragonECS
{ {
if (_matrix.TryGetValue(startEntityID, endEntityID, out int relEntityID)) if (_matrix.TryGetValue(startEntityID, endEntityID, out int relEntityID))
{ {
#if DEBUG && DRAGONECS_DEEP_DEBUG
if(_graphWorld.IsUsed(relEntityID) == false)
{
throw new InvalidOperationException();
}
var (s, e) = GetRelationStartEnd(relEntityID);
if (s != startEntityID || e != endEntityID)
{
throw new InvalidOperationException();
}
#endif
return relEntityID; return relEntityID;
} }
return NewRelationInternal(startEntityID, endEntityID); return NewRelationInternal(startEntityID, endEntityID);
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public int GetOrNewRelationNoDirection(int entityID, int otherEntityID)
{
return GetOrNewRelation(
entityID < otherEntityID ? entityID : otherEntityID,
entityID > otherEntityID ? entityID : otherEntityID);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public int GetOrNewInverseRelation(int relEntityID) public int GetOrNewInverseRelation(int relEntityID)
{ {
#if DEBUG || !DISABLE_DRAGONECS_ASSERT_CHEKS #if (DEBUG && !DISABLE_DEBUG) || !DISABLE_DRAGONECS_ASSERT_CHEKS
if (relEntityID <= 0 || relEntityID >= _relEntityInfos.Length) { Throw.UndefinedException(); } if (relEntityID <= 0 || relEntityID >= _relEntityInfos.Length) { Throw.UndefinedException(); }
#endif #endif
var info = _relEntityInfos[relEntityID]; var info = _relEntityInfos[relEntityID];
@ -124,15 +102,6 @@ namespace DCFApixels.DragonECS
private int NewRelationInternal(int startEntityID, int endEntityID) private int NewRelationInternal(int startEntityID, int endEntityID)
{ {
int relEntityID = _graphWorld.NewEntity(); int relEntityID = _graphWorld.NewEntity();
#if DEBUG && DRAGONECS_DEEP_DEBUG
var (s, e) = GetRelationStartEnd(relEntityID);
if (s != 0 || e != 0)
{
throw new InvalidOperationException();
}
#endif
_matrix.Add(startEntityID, endEntityID, relEntityID); _matrix.Add(startEntityID, endEntityID, relEntityID);
_relEntityInfos[relEntityID] = new RelationInfo(startEntityID, endEntityID); _relEntityInfos[relEntityID] = new RelationInfo(startEntityID, endEntityID);
_count++; _count++;
@ -164,7 +133,7 @@ namespace DCFApixels.DragonECS
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool TryGetInverseRelation(int relEntityID, out int inverseRelEntityID) public bool TryGetInverseRelation(int relEntityID, out int inverseRelEntityID)
{ {
#if DEBUG || !DISABLE_DRAGONECS_ASSERT_CHEKS #if (DEBUG && !DISABLE_DEBUG) || !DISABLE_DRAGONECS_ASSERT_CHEKS
if (relEntityID <= 0 || relEntityID >= _relEntityInfos.Length) { Throw.UndefinedException(); } if (relEntityID <= 0 || relEntityID >= _relEntityInfos.Length) { Throw.UndefinedException(); }
#endif #endif
var info = _relEntityInfos[relEntityID]; var info = _relEntityInfos[relEntityID];
@ -194,41 +163,17 @@ namespace DCFApixels.DragonECS
#region GetRelInfo #region GetRelInfo
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public int GetRelationOpposite(int relEntityID, int nodeEntityID)
{
#if DEBUG || !DISABLE_DRAGONECS_ASSERT_CHEKS
if (relEntityID <= 0 || relEntityID >= _relEntityInfos.Length) { Throw.UndefinedException(); }
#endif
return new StartEnd(_relEntityInfos[relEntityID]).GetOpposite(nodeEntityID);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public StartEnd GetRelationStartEnd(int relEntityID) public StartEnd GetRelationStartEnd(int relEntityID)
{ {
#if DEBUG || !DISABLE_DRAGONECS_ASSERT_CHEKS #if (DEBUG && !DISABLE_DEBUG) || !DISABLE_DRAGONECS_ASSERT_CHEKS
if (relEntityID <= 0 || relEntityID >= _relEntityInfos.Length) { Throw.UndefinedException(); } if (relEntityID <= 0 || relEntityID >= _relEntityInfos.Length) { Throw.UndefinedException(); }
#endif #endif
return new StartEnd(_relEntityInfos[relEntityID]); return new StartEnd(_relEntityInfos[relEntityID]);
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool IsRelationStart(int relEntityID, int nodeEntityID)
{
#if DEBUG || !DISABLE_DRAGONECS_ASSERT_CHEKS
if (relEntityID <= 0 || relEntityID >= _relEntityInfos.Length) { Throw.UndefinedException(); }
#endif
return _relEntityInfos[relEntityID].start == nodeEntityID;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool IsRelationEnd(int relEntityID, int nodeEntityID)
{
#if DEBUG || !DISABLE_DRAGONECS_ASSERT_CHEKS
if (relEntityID <= 0 || relEntityID >= _relEntityInfos.Length) { Throw.UndefinedException(); }
#endif
return _relEntityInfos[relEntityID].end == nodeEntityID;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public int GetRelationStart(int relEntityID) public int GetRelationStart(int relEntityID)
{ {
#if DEBUG || !DISABLE_DRAGONECS_ASSERT_CHEKS #if (DEBUG && !DISABLE_DEBUG) || !DISABLE_DRAGONECS_ASSERT_CHEKS
if (relEntityID <= 0 || relEntityID >= _relEntityInfos.Length) { Throw.UndefinedException(); } if (relEntityID <= 0 || relEntityID >= _relEntityInfos.Length) { Throw.UndefinedException(); }
#endif #endif
return _relEntityInfos[relEntityID].start; return _relEntityInfos[relEntityID].start;
@ -236,7 +181,7 @@ namespace DCFApixels.DragonECS
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public int GetRelationEnd(int relEntityID) public int GetRelationEnd(int relEntityID)
{ {
#if DEBUG || !DISABLE_DRAGONECS_ASSERT_CHEKS #if (DEBUG && !DISABLE_DEBUG) || !DISABLE_DRAGONECS_ASSERT_CHEKS
if (relEntityID <= 0 || relEntityID >= _relEntityInfos.Length) { Throw.UndefinedException(); } if (relEntityID <= 0 || relEntityID >= _relEntityInfos.Length) { Throw.UndefinedException(); }
#endif #endif
return _relEntityInfos[relEntityID].end; return _relEntityInfos[relEntityID].end;

View File

@ -1,7 +1,4 @@
#if DISABLE_DEBUG using DCFApixels.DragonECS.Graphs.Internal;
#undef DEBUG
#endif
using DCFApixels.DragonECS.Graphs.Internal;
using System; using System;
namespace DCFApixels.DragonECS namespace DCFApixels.DragonECS

View File

@ -1,8 +1,4 @@
#if DISABLE_DEBUG using DCFApixels.DragonECS.Graphs.Internal;
#undef DEBUG
#endif
using DCFApixels.DragonECS.Core;
using DCFApixels.DragonECS.Graphs.Internal;
namespace DCFApixels.DragonECS namespace DCFApixels.DragonECS
{ {

View File

@ -1,7 +1,5 @@
#if DISABLE_DEBUG using DCFApixels.DragonECS.Graphs.Internal;
#undef DEBUG using DCFApixels.DragonECS.UncheckedCore;
#endif
using DCFApixels.DragonECS.Graphs.Internal;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
@ -15,13 +13,13 @@ namespace DCFApixels.DragonECS.Graphs.Internal
private EcsWorld _graphWorld; private EcsWorld _graphWorld;
private EntityGraph _graph; private EntityGraph _graph;
private long _version = 0; private long _version;
private LinkedList _linkedList; private LinkedList _linkedList;
private LinkedListHead[] _linkedListSourceHeads; private LinkedListHead[] _linkedListSourceHeads;
//заменить на спарссет без пейджей private int[] _sourceEntities;
private EcsGroup _sourceEntities; private int _sourceEntitiesCount;
private int _targetWorldCapacity = -1; private int _targetWorldCapacity = -1;
//private EcsProfilerMarker _executeMarker = new EcsProfilerMarker("Join"); //private EcsProfilerMarker _executeMarker = new EcsProfilerMarker("Join");
@ -47,9 +45,9 @@ namespace DCFApixels.DragonECS.Graphs.Internal
_graphWorld = world; _graphWorld = world;
_linkedList = new OnlyAppendHeadLinkedList(_graphWorld.Capacity); _linkedList = new OnlyAppendHeadLinkedList(_graphWorld.Capacity);
_linkedListSourceHeads = new LinkedListHead[_graphWorld.Capacity]; _linkedListSourceHeads = new LinkedListHead[_graphWorld.Capacity];
_sourceEntities = new int[_graphWorld.Capacity * 2];
_graphWorld.AddListener(this); _graphWorld.AddListener(this);
_graph = _graphWorld.GetGraph(); _graph = _graphWorld.GetGraph();
_sourceEntities = EcsGroup.New(_graph.World);
} }
public void Destroy() public void Destroy()
{ {
@ -64,7 +62,7 @@ namespace DCFApixels.DragonECS.Graphs.Internal
private SubGraphMap ExecuteFor_Internal(EcsSpan span, JoinMode mode) private SubGraphMap ExecuteFor_Internal(EcsSpan span, JoinMode mode)
{ {
//_executeMarker.Begin(); //_executeMarker.Begin();
#if DEBUG || DRAGONECS_STABILITY_MODE #if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS
if (span.IsNull) { /*_executeMarker.End();*/ Throw.ArgumentNull(nameof(span)); } if (span.IsNull) { /*_executeMarker.End();*/ Throw.ArgumentNull(nameof(span)); }
if (span.WorldID != _graphWorld.ID) { /*_executeMarker.End();*/ Throw.Quiery_ArgumentDifferentWorldsException(); } if (span.WorldID != _graphWorld.ID) { /*_executeMarker.End();*/ Throw.Quiery_ArgumentDifferentWorldsException(); }
#endif #endif
@ -78,14 +76,12 @@ namespace DCFApixels.DragonECS.Graphs.Internal
else else
{ {
//ArrayUtility.Fill(_linkedListSourceHeads, default); //TODO оптимизировать, сделав не полную отчистку а только по элементов с прошлого раза //ArrayUtility.Fill(_linkedListSourceHeads, default); //TODO оптимизировать, сделав не полную отчистку а только по элементов с прошлого раза
//for (int i = 0; i < _sourceEntitiesCount; i++) for (int i = 0; i < _sourceEntitiesCount; i++)
for (int i = 0; i < _sourceEntities.Count; i++)
{ {
_linkedListSourceHeads[_sourceEntities[i]] = default; _linkedListSourceHeads[_sourceEntities[i]] = default;
} }
} }
//_sourceEntitiesCount = 0; _sourceEntitiesCount = 0;
_sourceEntities.Clear();
_linkedList.Clear(); _linkedList.Clear();
//Заполнение массивов //Заполнение массивов
@ -129,11 +125,10 @@ namespace DCFApixels.DragonECS.Graphs.Internal
{ {
return; return;
} }
_sourceEntities.Add(sourceEntityID);
ref var basket = ref _linkedListSourceHeads[sourceEntityID]; ref var basket = ref _linkedListSourceHeads[sourceEntityID];
//EcsDebug.Print("e" + sourceEntityID);
if (basket.head == 0) if (basket.head == 0)
{ {
_sourceEntities[_sourceEntitiesCount++] = sourceEntityID;
basket.head = _linkedList.NewHead(relationEntityID); basket.head = _linkedList.NewHead(relationEntityID);
} }
else else
@ -193,8 +188,7 @@ namespace DCFApixels.DragonECS.Graphs.Internal
#region GetEntites #region GetEntites
internal EcsSpan GetNodeEntities() internal EcsSpan GetNodeEntities()
{ {
//return UncheckedCoreUtility.CreateSpan(_graph.World.ID, _sourceEntities, _sourceEntitiesCount); return UncheckedCoreUtility.CreateSpan(_graph.World.ID, _sourceEntities, _sourceEntitiesCount);
return _sourceEntities.ToSpan();
} }
#endregion #endregion
} }

View File

@ -1,7 +1,4 @@
#if DISABLE_DEBUG using System;
#undef DEBUG
#endif
using System;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;

View File

@ -1,7 +1,4 @@
#if DISABLE_DEBUG namespace DCFApixels.DragonECS.Graphs.Internal
#undef DEBUG
#endif
namespace DCFApixels.DragonECS.Graphs.Internal
{ {
internal static unsafe class IntHash internal static unsafe class IntHash
{ {

View File

@ -1,7 +1,4 @@
#if DISABLE_DEBUG using System.Runtime.CompilerServices;
#undef DEBUG
#endif
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
namespace DCFApixels.DragonECS.Graphs.Internal namespace DCFApixels.DragonECS.Graphs.Internal

View File

@ -1,7 +1,4 @@
#if DISABLE_DEBUG using System;
#undef DEBUG
#endif
using System;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;

View File

@ -1,7 +1,4 @@
#if DISABLE_DEBUG using System.Runtime.CompilerServices;
#undef DEBUG
#endif
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using TValue = System.Int32; using TValue = System.Int32;

View File

@ -1,7 +1,4 @@
#if DISABLE_DEBUG using System;
#undef DEBUG
#endif
using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;

View File

@ -1,7 +1,4 @@
#if DISABLE_DEBUG using System;
#undef DEBUG
#endif
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;

View File

@ -1,7 +1,4 @@
#if DISABLE_DEBUG using DCFApixels.DragonECS.Graphs.Internal;
#undef DEBUG
#endif
using DCFApixels.DragonECS.Graphs.Internal;
using System; using System;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
@ -58,23 +55,12 @@ namespace DCFApixels.DragonECS
public static bool operator !=(StartEnd a, StartEnd b) { return a.start != b.start || a.end != b.end; } public static bool operator !=(StartEnd a, StartEnd b) { return a.start != b.start || a.end != b.end; }
#endregion #endregion
#region Methods
public int GetOpposite(int entityID)
{
#if DEBUG
if (entityID != start && entityID != end) { Throw.UndefinedException(); }
#endif
//return entityID > end ? end : start;
return entityID == end ? start : end;
}
#endregion
#region Other #region Other
public override int GetHashCode() { throw new NotSupportedException(); } public override int GetHashCode() { throw new NotSupportedException(); }
public override bool Equals(object obj) { throw new NotSupportedException(); } public override bool Equals(object obj) { throw new NotSupportedException(); }
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool Equals(StartEnd other) { return this == other; } public bool Equals(StartEnd other) { return this == other; }
public override string ToString() { return $"rel({start} -> {end})"; } public override string ToString() { return $"arc({start} -> {end})"; }
#endregion #endregion
} }
} }