internal override void OnUpdate(bool forceRebuild, HashSet <T> addedItems, HashSet <T> removedItems, HashSet <T> invalidItems) { if (forceRebuild) { // Total rebuild. Re-Add all Items. _edges[0].Clear(); _edges[1].Clear(); _edges[2].Clear(); _itemInfos.Clear(); if (_broadPhase != null) { _broadPhase.Clear(); } if (EnableSelfOverlaps) { SelfOverlaps.Clear(); } foreach (var item in Items) { AddItem(item); } } else { // Refit - the default case. // First, remove all old items. foreach (T removedItem in removedItems) { RemoveItem(removedItem); } // Second, update all invalid items before we add the new items. if (invalidItems == null) { // Update all items. foreach (ItemInfo itemInfo in _itemInfos) { UpdateItem(itemInfo); } } else { // Update items marked as invalid. foreach (T invalidItem in invalidItems) { UpdateItem(invalidItem); } } // Third, add all the new items. foreach (var addedItem in addedItems) { AddItem(addedItem); } } // Update AABB of whole space. UpdateAabb(); }