diff --git a/osu.Game/Rulesets/UI/HitObjectContainer.cs b/osu.Game/Rulesets/UI/HitObjectContainer.cs
index 3d74cdedd6..1d32313f2b 100644
--- a/osu.Game/Rulesets/UI/HitObjectContainer.cs
+++ b/osu.Game/Rulesets/UI/HitObjectContainer.cs
@@ -19,6 +19,16 @@ namespace osu.Game.Rulesets.UI
{
public class HitObjectContainer : CompositeDrawable, IHitObjectContainer
{
+ ///
+ /// All entries in this including dead entries.
+ ///
+ public IEnumerable Entries => allEntries;
+
+ ///
+ /// All alive entries and s used by the entries.
+ ///
+ public IEnumerable<(HitObjectLifetimeEntry Entry, DrawableHitObject Drawable)> AliveEntries => drawableMap.Select(x => (x.Key, x.Value));
+
public IEnumerable Objects => InternalChildren.Cast().OrderBy(h => h.HitObject.StartTime);
public IEnumerable AliveObjects => AliveInternalChildren.Cast().OrderBy(h => h.HitObject.StartTime);
@@ -60,10 +70,13 @@ namespace osu.Game.Rulesets.UI
internal double FutureLifetimeExtension { get; set; }
private readonly Dictionary startTimeMap = new Dictionary();
+
private readonly Dictionary drawableMap = new Dictionary();
- private readonly LifetimeEntryManager lifetimeManager = new LifetimeEntryManager();
private readonly Dictionary nonPooledDrawableMap = new Dictionary();
+ private readonly LifetimeEntryManager lifetimeManager = new LifetimeEntryManager();
+ private readonly HashSet allEntries = new HashSet();
+
[Resolved(CanBeNull = true)]
private IPooledHitObjectProvider pooledObjectProvider { get; set; }
@@ -86,13 +99,18 @@ namespace osu.Game.Rulesets.UI
#region Pooling support
- public void Add(HitObjectLifetimeEntry entry) => lifetimeManager.AddEntry(entry);
+ public void Add(HitObjectLifetimeEntry entry)
+ {
+ allEntries.Add(entry);
+ lifetimeManager.AddEntry(entry);
+ }
public bool Remove(HitObjectLifetimeEntry entry)
{
if (!lifetimeManager.RemoveEntry(entry)) return false;
- // It has to be done here because non-pooled entry may be removed by specifying its entry.
+ // The entry has to be removed from the non-pooled map here because non-pooled entry may be removed by specifying its entry.
nonPooledDrawableMap.Remove(entry);
+ allEntries.Remove(entry);
return true;
}