示例#1
0
        public Node <DataType> GetChangedChildren(NodeRef <DataType> child1, NodeRef <DataType> child2)
        {
            Node <DataType> n = this;

            n.Child1 = child1;
            n.Child2 = child2;
            return(n.GetComputedBounds());
        }
示例#2
0
 public Node(BVH <DataType> owner, int id, int threshold)
 {
     ID       = id;
     Child1   = new NodeRef <DataType>(owner);
     Child2   = new NodeRef <DataType>(owner);
     LeafData = new List <DataType>(threshold);
     Bounds   = new Rect();
 }
示例#3
0
        public Node <DataType> GetNonLeafVersion(NodeRef <DataType> child1, NodeRef <DataType> child2)
        {
            Node <DataType> n = this;

            n.LeafData = null;
            n.Child1   = child1;
            n.Child2   = child2;
            return(n);
        }
示例#4
0
        private void RemoveNode(NodeRef <DataType> n)
        {
            int i = n.Index;

            if (i >= 0)
            {
                nodes.RemoveAt(i);
                nodeIDs.RemoveAt(i);

                unchecked { versionNum += 1; }
                CountNodes -= 1;
            }
        }
示例#5
0
        private void SplitNode(int nodeIndex)
        {
            //Sort the items by their X position.
            List <float> centerPoses = nodes[nodeIndex].LeafData.Select(d => GetBounds(d).center.x).ToList();

            nodes[nodeIndex].LeafData.Sort((d1, di1, d2, di2) =>
            {
                if (centerPoses[di1] < centerPoses[di2])
                {
                    return(-1);
                }
                else if (centerPoses[di1] > centerPoses[di2])
                {
                    return(1);
                }
                else
                {
                    return(0);
                }
            });


            //Put the first half of the items in the first child node.
            //Put the second half of the items in the second child node.
            NodeRef <DataType> child1 = MakeNode(),
                               child2 = MakeNode();
            int i1 = child1.Index,
                i2 = child2.Index;

            for (int i = 0; i < nodes[nodeIndex].LeafData.Count; ++i)
            {
                if (i <= (nodes[nodeIndex].LeafData.Count / 2))
                {
                    nodes[i1].LeafData.Add(nodes[nodeIndex].LeafData[i]);
                }
                else
                {
                    nodes[i2].LeafData.Add(nodes[nodeIndex].LeafData[i]);
                }
            }

            nodes[nodeIndex] = nodes[nodeIndex].GetNonLeafVersion(child1, child2);
            nodes[i1]        = nodes[i1].GetComputedBounds();
            nodes[i2]        = nodes[i2].GetComputedBounds();
        }