/// <summary> /// /// This is static to make this a non-virtual call /// </summary> /// <param name="parent"></param> /// <param name="child"></param> /// <param name="frustum"></param> /// <param name="parentBB"></param> /// <param name="skipFrustumCheck"></param> private static void updateVisibility(CompactQuadTree <bool> .Node parent, CompactQuadTreeChild child, ref CullingInfo frustum, ref BoundingBox parentBB, bool skipFrustumCheck) { BoundingBox bb; switch (child) { case CompactQuadTreeChild.UpperLeft: bb = new BoundingBox( new Vector3( parentBB.Minimum.X, parentBB.Minimum.Y, parentBB.Minimum.Z), new Vector3( (parentBB.Maximum.X + parentBB.Minimum.X) * 0.5f, parentBB.Maximum.Y, (parentBB.Maximum.Z + parentBB.Minimum.Z) * 0.5f)); break; case CompactQuadTreeChild.UpperRight: bb = new BoundingBox( new Vector3((parentBB.Minimum.X + parentBB.Maximum.X) * 0.5f, parentBB.Minimum.Y, parentBB.Minimum.Z), new Vector3(parentBB.Maximum.X, parentBB.Maximum.Y, (parentBB.Maximum.Z + parentBB.Minimum.Z) * 0.5f)); break; case CompactQuadTreeChild.LowerLeft: bb = new BoundingBox( new Vector3(parentBB.Minimum.X, parentBB.Minimum.Y, (parentBB.Maximum.Z + parentBB.Minimum.Z) * 0.5f), new Vector3((parentBB.Maximum.X + parentBB.Minimum.X) * 0.5f, parentBB.Maximum.Y, parentBB.Maximum.Z)); break; case CompactQuadTreeChild.LowerRight: bb = new BoundingBox( new Vector3((parentBB.Maximum.X + parentBB.Minimum.X) * 0.5f, parentBB.Minimum.Y, (parentBB.Maximum.Z + parentBB.Minimum.Z) * 0.5f), new Vector3(parentBB.Maximum.X, parentBB.Maximum.Y, parentBB.Maximum.Z)); break; default: throw new ArgumentOutOfRangeException("child"); } updateVisibility(parent.GetChild(child), ref frustum, ref bb, skipFrustumCheck); }
public Node GetChild(CompactQuadTreeChild c) { return(new Node(Index * 4 + (int)c)); // parent * 4 + childindex }