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();
        }