remove relationMatrix

This commit is contained in:
Mikhail 2024-02-03 21:45:36 +08:00
parent 08b25ed671
commit 5d4573f431

View File

@ -2,6 +2,7 @@
using DCFApixels.DragonECS.Relations.Utils; using DCFApixels.DragonECS.Relations.Utils;
using System; using System;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Xml;
namespace DCFApixels.DragonECS namespace DCFApixels.DragonECS
{ {
@ -20,7 +21,7 @@ namespace DCFApixels.DragonECS
private readonly EndWorldHandler _endWorldHandler; private readonly EndWorldHandler _endWorldHandler;
private readonly LoopWorldHandler _loopWorldHandler; private readonly LoopWorldHandler _loopWorldHandler;
private readonly SparseArray64<int> _relationsMatrix = new SparseArray64<int>(); //private readonly SparseArray64<int> _relationsMatrix = new SparseArray64<int>();
private EcsGraph _entitiesGraph; private EcsGraph _entitiesGraph;
private EcsGraph.FriendEcsArc _entitiesGraphFriend; private EcsGraph.FriendEcsArc _entitiesGraphFriend;
@ -123,60 +124,72 @@ namespace DCFApixels.DragonECS
#region New/Del #region New/Del
public int NewRelation(int startEntityID, int endEntityID) public int NewRelation(int startEntityID, int endEntityID)
{ {
if (HasRelation(startEntityID, endEntityID)) //if (HasRelation(startEntityID, endEntityID))
{ //{
Throw.RelationAlreadyExists(); // Throw.RelationAlreadyExists();
} //}
int relEntity = _arcWorld.NewEntity(); int relEntity = _arcWorld.NewEntity();
_relationsMatrix.Add(startEntityID, endEntityID, relEntity); //_relationsMatrix.Add(startEntityID, endEntityID, relEntity);
_relEntityInfos[relEntity] = new RelEntityInfo(startEntityID, endEntityID); _relEntityInfos[relEntity] = new RelEntityInfo(startEntityID, endEntityID);
_relEntities.Add(relEntity); _relEntities.Add(relEntity);
_entitiesGraph.Add(relEntity); _entitiesGraph.Add(relEntity);
return relEntity; return relEntity;
} }
public void DelRelation(int startEntityID, int endEntityID) //public void DelRelation(int startEntityID, int endEntityID)
//{
// if (_relationsMatrix.TryGetValue(startEntityID, endEntityID, out int relEntityID))
// {
// _arcWorld.DelEntity(relEntityID);
// }
// else
// {
// Throw.UndefinedRelationException();
// }
//}
public void DelRelation(int relEntityID)
{ {
if (_relationsMatrix.TryGetValue(startEntityID, endEntityID, out int relEntity)) _arcWorld.DelEntity(relEntityID);
{
_arcWorld.DelEntity(relEntity);
}
else
{
Throw.UndefinedRelationException();
}
} }
private void ClearRelation_Internal(int startEntityID, int endEntityID) public void ClearRelation_Internal(int relEntityID)
{ {
if (_relationsMatrix.TryGetValue(startEntityID, endEntityID, out int relEntity)) _relEntities.Remove(relEntityID);
{ _entitiesGraph.Del(relEntityID);
_relEntities.Remove(relEntity); _relEntityInfos[relEntityID] = RelEntityInfo.Empty;
_entitiesGraph.Del(relEntity);
_relationsMatrix.Remove(startEntityID, endEntityID);
_relEntityInfos[relEntity] = RelEntityInfo.Empty;
}
} }
//private void ClearRelation_Internal(int startEntityID, int endEntityID)
//{
// if (_relationsMatrix.TryGetValue(startEntityID, endEntityID, out int relEntityID))
// {
// _relEntities.Remove(relEntityID);
// _entitiesGraph.Del(relEntityID);
// _relationsMatrix.Remove(startEntityID, endEntityID);
// _relEntityInfos[relEntityID] = RelEntityInfo.Empty;
// }
//}
#endregion #endregion
#region GetRelation/HasRelation #region GetRelation/HasRelation
public bool HasRelation(int startEntityID, int endEntityID) //public bool HasRelation(int startEntityID, int endEntityID)
{ //{
return _relationsMatrix.Contains(startEntityID, endEntityID); // return _relationsMatrix.Contains(startEntityID, endEntityID);
} //}
public int GetRelation(int startEntityID, int endEntityID) //public int GetRelation(int startEntityID, int endEntityID)
{ //{
if (!_relationsMatrix.TryGetValue(startEntityID, endEntityID, out int relEntityID)) // if (!_relationsMatrix.TryGetValue(startEntityID, endEntityID, out int relEntityID))
{ // {
Throw.UndefinedRelationException(); // Throw.UndefinedRelationException();
} // }
return relEntityID; // return relEntityID;
} //}
public bool TryGetRelation(int startEntityID, int endEntityID, out int relEntityID) //public bool TryGetRelation(int startEntityID, int endEntityID, out int relEntityID)
{ //{
return _relationsMatrix.TryGetValue(startEntityID, endEntityID, out relEntityID); // return _relationsMatrix.TryGetValue(startEntityID, endEntityID, out relEntityID);
} //}
#endregion #endregion
#region ArcEntityInfo #region ArcEntityInfo
@ -209,18 +222,18 @@ namespace DCFApixels.DragonECS
return GetRelationInfo(relEntityID).end; return GetRelationInfo(relEntityID).end;
} }
[MethodImpl(MethodImplOptions.AggressiveInlining)] //[MethodImpl(MethodImplOptions.AggressiveInlining)]
public int GetInversedRelation(int relEntityID) //public int GetInversedRelation(int relEntityID)
{ //{
var (startEntityID, endEntityID) = GetRelationInfo(relEntityID); // var (startEntityID, endEntityID) = GetRelationInfo(relEntityID);
return GetRelation(endEntityID, startEntityID); // return GetRelation(endEntityID, startEntityID);
} //}
[MethodImpl(MethodImplOptions.AggressiveInlining)] //[MethodImpl(MethodImplOptions.AggressiveInlining)]
public bool TryGetInversedRelation(int relEntityID, out int inversedRelEntityID) //public bool TryGetInversedRelation(int relEntityID, out int inversedRelEntityID)
{ //{
var (startEntityID, endEntityID) = GetRelationInfo(relEntityID); // var (startEntityID, endEntityID) = GetRelationInfo(relEntityID);
return TryGetRelation(endEntityID, startEntityID, out inversedRelEntityID); // return TryGetRelation(endEntityID, startEntityID, out inversedRelEntityID);
} //}
#endregion #endregion
#region Other #region Other
@ -253,8 +266,9 @@ namespace DCFApixels.DragonECS
{ {
foreach (var relEntityID in relEntityBuffer) foreach (var relEntityID in relEntityBuffer)
{ {
var (startEntityID, endEntityID) = _arc._relEntityInfos[relEntityID]; //var (startEntityID, endEntityID) = _arc._relEntityInfos[relEntityID];
_arc.ClearRelation_Internal(startEntityID, endEntityID); //_arc.ClearRelation_Internal(startEntityID, endEntityID);
_arc.ClearRelation_Internal(relEntityID);
} }
} }
public void OnWorldDestroy() { } public void OnWorldDestroy() { }