public void AddNode(AABBNode node) { node.UpdateAABB(); if (leaves.Capacity == 0) { root = node; leaves.Add(node); } else { AABBNode currentNode = root; //Find a sibling for a new node while (!currentNode.IsLeaf()) { currentNode = SearchNode(node, currentNode); } currentNode = InsertNode(currentNode, node); //Check if it's a 2nd iteration and if tree can be balanced Balance(currentNode); leaves.Add(node); } }
//Adjust sizes of AABB's after insertion of a new Node private void AdjustSizeOfOne(AABBNode node) { while (node != null) { node.UpdateAABB(); node = node.parent; } }
//If needed all the bounds can be recalculated using this function private void AdjustAllBounds() { List <AABBNode> nodestoCheck2 = new List <AABBNode>(leaves); List <AABBNode> nodestoCheck1 = new List <AABBNode>(); int c = 1; while (!nodestoCheck2.Contains(root) && !nodestoCheck1.Contains(root)) { if (c % 2 == 0) { nodestoCheck2.Clear(); foreach (AABBNode node in nodestoCheck1) { if (!nodestoCheck2.Contains(node.parent)) { nodestoCheck2.Add(node.parent); } node.UpdateAABB(); } c = 1; } else { nodestoCheck1.Clear(); foreach (AABBNode node in nodestoCheck2) { if (!nodestoCheck1.Contains(node.parent)) { nodestoCheck1.Add(node.parent); } node.UpdateAABB(); } c++; } } root.UpdateAABB(); }