unsafe void PushSame(Node *node, TestPair *stack, ref int count) { var element = stack + count++; element->A = node; element->Type = PairType.SameNode; }
unsafe void PushDifferent(Node *a, Node *b, TestPair *stack, ref int count) { var element = stack + count++; element->A = a; element->B = b; element->Type = PairType.InternalInternal; }
unsafe void TestDifferent <TResultList>(int a, int b, BoundingBox *aBounds, BoundingBox *bBounds, TestPair *stack, ref int nextToVisit, ref TResultList results) where TResultList : IList <Overlap> { if (a >= 0) { if (b >= 0) { //both internal nodes PushDifferent(nodes + a, nodes + b, stack, ref nextToVisit); } else { //leaf and internal PushLeafInternal(nodes + a, bBounds, b, stack, ref nextToVisit); } } else if (b >= 0) { //leaf and internal PushLeafInternal(nodes + b, aBounds, a, stack, ref nextToVisit); } else { //two leaves results.Add(new Overlap { A = Encode(a), B = Encode(b) }); } }
unsafe void PushLeafInternal(Node *internalNode, BoundingBox *leafBounds, int encodedLeafIndex, TestPair *stack, ref int count) { var element = stack + count++; element->A = internalNode; element->LeafBounds = leafBounds; element->EncodedLeafIndex = encodedLeafIndex; element->Type = PairType.LeafInternal; }