Esempio n. 1
0
    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);
        }
    }
Esempio n. 2
0
 //Adjust sizes of AABB's after insertion of a new Node
 private void AdjustSizeOfOne(AABBNode node)
 {
     while (node != null)
     {
         node.UpdateAABB();
         node = node.parent;
     }
 }
Esempio n. 3
0
    //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();
    }