#if SVELTO_LEGACY_FILTERS
using DBC.ECS;
using Svelto.DataStructures;
using Svelto.DataStructures.Native;
using Svelto.ECS.Internal;
namespace Svelto.ECS
{
///
/// This feature must be eventually tied to the new ExclusiveGroup that won't allow the use of
/// custom EntitiesID
/// The filters could be updated when entities buffer changes during the submission, while now this process
/// is completely manual.
/// Making this working properly is not in my priorities right now, as I will need to add the new group type
/// AND optimize the submission process to be able to add more overhead
///
public partial class EntitiesDB
{
FasterDictionary> _filters =>
_enginesRoot._groupFilters;
public LegacyFilters GetLegacyFilters()
{
return new LegacyFilters(_filters);
}
public readonly struct LegacyFilters
{
public LegacyFilters(
FasterDictionary>
filtersLegacy)
{
_filtersLegacy = filtersLegacy;
}
public ref LegacyFilterGroup CreateOrGetFilterForGroup(int filterID, ExclusiveGroupStruct groupID)
where T : struct, _IInternalEntityComponent
{
var refWrapper = ComponentTypeID.id;
return ref CreateOrGetFilterForGroup(filterID, groupID, refWrapper);
}
public bool HasFiltersForGroup(ExclusiveGroupStruct groupID) where T : struct, _IInternalEntityComponent
{
if (_filtersLegacy.TryGetValue(ComponentTypeID.id, out var fasterDictionary) == false)
return false;
return fasterDictionary.ContainsKey(groupID);
}
public bool HasFilterForGroup(int filterID, ExclusiveGroupStruct groupID)
where T : struct, _IInternalEntityComponent
{
if (_filtersLegacy.TryGetValue(ComponentTypeID.id, out var fasterDictionary) == false)
return false;
if (fasterDictionary.TryGetValue(groupID, out var result))
return result.HasFilter(filterID);
return false;
}
public ref LegacyGroupFilters CreateOrGetFiltersForGroup(ExclusiveGroupStruct groupID)
where T : struct, _IInternalEntityComponent
{
var fasterDictionary = _filtersLegacy.GetOrAdd(ComponentTypeID.id,
() => new FasterDictionary());
return ref fasterDictionary.GetOrAdd(groupID,
() => new LegacyGroupFilters(new SharedSveltoDictionaryNative(0), groupID));
}
public ref LegacyGroupFilters GetFiltersForGroup(ExclusiveGroupStruct groupID)
where T : struct, _IInternalEntityComponent
{
#if DEBUG && !PROFILE_SVELTO
if (_filtersLegacy.ContainsKey(ComponentTypeID.id) == false)
throw new ECSException($"trying to fetch not existing filters, type {typeof(T)}");
if (_filtersLegacy[ComponentTypeID.id].ContainsKey(groupID) == false)
throw new ECSException(
$"trying to fetch not existing filters, type {typeof(T)} group {groupID.ToName()}");
#endif
return ref _filtersLegacy[ComponentTypeID.id].GetValueByRef(groupID);
}
public ref LegacyFilterGroup GetFilterForGroup(int filterId, ExclusiveGroupStruct groupID)
where T : struct, _IInternalEntityComponent
{
#if DEBUG && !PROFILE_SVELTO
if (_filtersLegacy.ContainsKey(ComponentTypeID.id) == false)
throw new ECSException($"trying to fetch not existing filters, type {typeof(T)}");
if (_filtersLegacy[ComponentTypeID.id].ContainsKey(groupID) == false)
throw new ECSException(
$"trying to fetch not existing filters, type {typeof(T)} group {groupID.ToName()}");
#endif
return ref _filtersLegacy[ComponentTypeID.id][groupID].GetFilter(filterId);
}
public bool TryGetFilterForGroup(int filterId, ExclusiveGroupStruct groupID,
out LegacyFilterGroup groupLegacyFilter) where T : struct, _IInternalEntityComponent
{
groupLegacyFilter = default;
if (_filtersLegacy.TryGetValue(ComponentTypeID.id, out var fasterDictionary) == false)
return false;
if (fasterDictionary.TryGetValue(groupID, out var groupFilters) == false)
return false;
if (groupFilters.TryGetFilter(filterId, out groupLegacyFilter) == false)
return false;
return true;
}
public bool TryGetFiltersForGroup(ExclusiveGroupStruct groupID,
out LegacyGroupFilters legacyGroupFilters) where T : struct, _IInternalEntityComponent
{
legacyGroupFilters = default;
if (_filtersLegacy.TryGetValue(ComponentTypeID.id, out var fasterDictionary) == false)
return false;
return fasterDictionary.TryGetValue(groupID, out legacyGroupFilters);
}
public void ClearFilter(int filterID, ExclusiveGroupStruct exclusiveGroupStruct)
{
if (_filtersLegacy.TryGetValue(ComponentTypeID.id, out var fasterDictionary))
{
Check.Require(fasterDictionary.ContainsKey(exclusiveGroupStruct),
$"trying to clear filter not present in group {exclusiveGroupStruct}");
fasterDictionary[exclusiveGroupStruct].ClearFilter(filterID);
}
}
public void ClearFilters(int filterID)
{
if (_filtersLegacy.TryGetValue(ComponentTypeID.id, out var fasterDictionary))
foreach (var filtersPerGroup in fasterDictionary)
filtersPerGroup.value.ClearFilter(filterID);
}
public void DisposeFilters(ExclusiveGroupStruct exclusiveGroupStruct)
{
if (_filtersLegacy.TryGetValue(ComponentTypeID.id, out var fasterDictionary))
{
fasterDictionary[exclusiveGroupStruct].DisposeFilters();
fasterDictionary.Remove(exclusiveGroupStruct);
}
}
public void DisposeFilters()
{
if (_filtersLegacy.TryGetValue(ComponentTypeID.id, out var fasterDictionary))
foreach (var filtersPerGroup in fasterDictionary)
filtersPerGroup.value.DisposeFilters();
_filtersLegacy.Remove(ComponentTypeID.id);
}
public void DisposeFilterForGroup(int resetFilterID, ExclusiveGroupStruct group)
{
if (_filtersLegacy.TryGetValue(ComponentTypeID.id, out var fasterDictionary))
fasterDictionary[@group].DisposeFilter(resetFilterID);
}
public bool TryRemoveEntityFromFilter(int filtersID, EGID egid) where T : struct, _IInternalEntityComponent
{
if (TryGetFilterForGroup(filtersID, egid.groupID, out var filter))
return filter.TryRemove(egid.entityID);
return false;
}
public void RemoveEntityFromFilter(int filtersID, EGID egid) where T : struct, _IInternalEntityComponent
{
ref var filter = ref GetFilterForGroup(filtersID, egid.groupID);
filter.Remove(egid.entityID);
}
public bool AddEntityToFilter(int filtersID, EGID egid, N mapper) where N : IEGIDMapper
{
ref var filter =
ref CreateOrGetFilterForGroup(filtersID, egid.groupID, new RefWrapperType(mapper.entityType));
return filter.Add(egid.entityID, mapper);
}
internal ref LegacyFilterGroup CreateOrGetFilterForGroup(int filterID, ExclusiveGroupStruct groupID,
RefWrapperType refWrapper)
{
var fasterDictionary = _filtersLegacy.GetOrAdd(refWrapper,
() => new FasterDictionary());
var filters = fasterDictionary.GetOrAdd(groupID,
(ref ExclusiveGroupStruct gid) =>
new LegacyGroupFilters(new SharedSveltoDictionaryNative(0), gid),
ref groupID);
return ref filters.CreateOrGetFilter(filterID);
}
readonly FasterDictionary>
_filtersLegacy;
}
}
}
#endif