OctreeNode <T>[] BuildNodes() { Vector3 dimensions = Bounds.Maximum - Bounds.Minimum; // Vector3 half = dimensions * 0.25f; Vector3 center = Bounds.Center; var m_region = Bounds; var octant = new AxisAlignedBox[NumChildNodes]; octant[0] = new AxisAlignedBox(m_region.Minimum, center); octant[1] = new AxisAlignedBox(new Vector3(center.X, m_region.Minimum.Y, m_region.Minimum.Z), new Vector3(m_region.Maximum.X, center.Y, center.Z)); octant[2] = new AxisAlignedBox(new Vector3(center.X, m_region.Minimum.Y, center.Z), new Vector3(m_region.Maximum.X, center.Y, m_region.Maximum.Z)); octant[3] = new AxisAlignedBox(new Vector3(m_region.Minimum.X, m_region.Minimum.Y, center.Z), new Vector3(center.X, center.Y, m_region.Maximum.Z)); octant[4] = new AxisAlignedBox(new Vector3(m_region.Minimum.X, center.Y, m_region.Minimum.Z), new Vector3(center.X, m_region.Maximum.Y, center.Z)); octant[5] = new AxisAlignedBox(new Vector3(center.X, center.Y, m_region.Minimum.Z), new Vector3(m_region.Maximum.X, m_region.Maximum.Y, center.Z)); octant[6] = new AxisAlignedBox(center, m_region.Maximum); octant[7] = new AxisAlignedBox(new Vector3(m_region.Minimum.X, center.Y, center.Z), new Vector3(center.X, m_region.Maximum.Y, m_region.Maximum.Z)); return(octant.Select(x => new OctreeNode <T>(ref x, MaximumChildren, this)).ToArray()); }