public Node <DataType> GetChangedChildren(NodeRef <DataType> child1, NodeRef <DataType> child2) { Node <DataType> n = this; n.Child1 = child1; n.Child2 = child2; return(n.GetComputedBounds()); }
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(); }
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); }
private void RemoveNode(NodeRef <DataType> n) { int i = n.Index; if (i >= 0) { nodes.RemoveAt(i); nodeIDs.RemoveAt(i); unchecked { versionNum += 1; } CountNodes -= 1; } }
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(); }