internal override void GetOverlaps(Node opposingNode, DynamicHierarchy owner) { bool intersects; //note: This is never executed when the opposing node is the current node. if (opposingNode.IsLeaf) { //We're both leaves! Our parents have already done the testing for us, so we know we're overlapping. owner.TryToAddOverlap(element, opposingNode.Element); } else { var opposingChildA = opposingNode.ChildA; var opposingChildB = opposingNode.ChildB; //If it's not a leaf, try to go deeper in the opposing hierarchy. BoundingBox.Intersects(ref opposingChildA.BoundingBox, out intersects); if (intersects) { GetOverlaps(opposingChildA, owner); } BoundingBox.Intersects(ref opposingChildB.BoundingBox, out intersects); if (intersects) { GetOverlaps(opposingChildB, owner); } } }
internal override void GetMultithreadedOverlaps(Node opposingNode, int splitDepth, int currentDepth, DynamicHierarchy owner, RawList <DynamicHierarchy.NodePair> multithreadingSourceOverlaps) { bool intersects; //note: This is never executed when the opposing node is the current node. if (opposingNode.IsLeaf) { //We're both leaves! Our parents have already done the testing for us, so we know we're overlapping. owner.TryToAddOverlap(element, opposingNode.Element); } else { var opposingChildA = opposingNode.ChildA; var opposingChildB = opposingNode.ChildB; if (splitDepth == currentDepth) { //Time to add the child overlaps to the multithreading set! BoundingBox.Intersects(ref opposingChildA.BoundingBox, out intersects); if (intersects) { multithreadingSourceOverlaps.Add(new DynamicHierarchy.NodePair() { a = this, b = opposingChildA }); } BoundingBox.Intersects(ref opposingChildB.BoundingBox, out intersects); if (intersects) { multithreadingSourceOverlaps.Add(new DynamicHierarchy.NodePair() { a = this, b = opposingChildB }); } return; } //If it's not a leaf, try to go deeper in the opposing hierarchy. BoundingBox.Intersects(ref opposingChildA.BoundingBox, out intersects); if (intersects) { GetOverlaps(opposingChildA, owner); } BoundingBox.Intersects(ref opposingChildB.BoundingBox, out intersects); if (intersects) { GetOverlaps(opposingChildB, owner); } } }