update mask exception

This commit is contained in:
Mikhail 2024-04-18 22:21:15 +08:00
parent f2238cd33a
commit 977ac5dbbd

View File

@ -367,50 +367,64 @@ namespace DCFApixels.DragonECS
int operation = OpMaskKey.EXCEPT_OP; int operation = OpMaskKey.EXCEPT_OP;
if (_opMasks.TryGetValue(new OpMaskKey(a.id, b.id, operation), out EcsMask result) == false) if (_opMasks.TryGetValue(new OpMaskKey(a.id, b.id, operation), out EcsMask result) == false)
{ {
var builder = New(a.World);
if (a.IsConflictWith(b)) if (a.IsConflictWith(b))
{ {
return a.World.Get<WorldMaskComponent>().BrokenMask; return a.World.Get<WorldMaskComponent>().BrokenMask;
} }
ExceptMaskConstraint(builder, a.inc, b.inc, true); result = New(a.World).Combine(a).Except(b).Build();
ExceptMaskConstraint(builder, a.exc, b.exc, false);
result = builder.Build();
_opMasks.Add(new OpMaskKey(a.id, b.id, operation), result); _opMasks.Add(new OpMaskKey(a.id, b.id, operation), result);
} }
return result; return result;
} }
private void ExceptMaskConstraint(Builder b, int[] acnstrs, int[] bcnstrs, bool isInc) //internal EcsMask ExceptMask(EcsMask a, EcsMask b)
{ //{
for (int i = 0, ii = 0; i < acnstrs.Length; i++) // int operation = OpMaskKey.EXCEPT_OP;
{ // if (_opMasks.TryGetValue(new OpMaskKey(a.id, b.id, operation), out EcsMask result) == false)
int acnst = acnstrs[i]; // {
while (ii < bcnstrs.Length && acnst > bcnstrs[ii]) // var builder = New(a.World);
{ // if (a.IsConflictWith(b))
ii++; // {
} // return a.World.Get<WorldMaskComponent>().BrokenMask;
if (ii >= bcnstrs.Length) // }
{ // ExceptMaskConstraint(builder, a.inc, b.inc, true);
break; // ExceptMaskConstraint(builder, a.exc, b.exc, false);
} // result = builder.Build();
int binc = bcnstrs[ii]; // _opMasks.Add(new OpMaskKey(a.id, b.id, operation), result);
if (acnst == binc) // }
{ // return result;
if (isInc) //}
{ //private void ExceptMaskConstraint(Builder b, int[] acnstrs, int[] bcnstrs, bool isInc)
b.Include(acnst); //{
} // for (int i = 0, ii = 0; i < acnstrs.Length; i++)
else // {
{ // int acnst = acnstrs[i];
b.Exclude(acnst); // while (ii < bcnstrs.Length && acnst > bcnstrs[ii])
} // {
} // ii++;
} // }
} // if (ii >= bcnstrs.Length)
// {
// break;
// }
// int binc = bcnstrs[ii];
// if (acnst == binc)
// {
// if (isInc)
// {
// b.Include(acnst);
// }
// else
// {
// b.Exclude(acnst);
// }
// }
// }
//}
internal EcsMask GetMask(Key maskKey) internal EcsMask GetMask(Key maskKey)
{ {
if (!_masks.TryGetValue(maskKey, out EcsMask result)) if (!_masks.TryGetValue(maskKey, out EcsMask result))
{ {
result = EcsMask.New(_masks.Count, _world.id, maskKey.inc, maskKey.exc); result = New(_masks.Count, _world.id, maskKey.inc, maskKey.exc);
_masks.Add(maskKey, result); _masks.Add(maskKey, result);
} }
return result; return result;