private BroadphasePair internalAddPair(BroadphaseProxy proxy0, BroadphaseProxy proxy1) { if (proxy0.getUid() > proxy1.getUid()) { BroadphaseProxy tmp = proxy0; proxy0 = proxy1; proxy1 = tmp; } UUID proxyId1 = proxy0.getUid(); UUID proxyId2 = proxy1.getUid(); int hash = getHash(proxyId1, proxyId2); // New hash value with new mask BroadphasePair pair = internalFindPair(proxy0, proxy1, hash); if (pair != null) { return(pair); } // hash with new capacity hash = getHash(proxyId1, proxyId2); pair = new BroadphasePair(proxy0, proxy1); overlappingPairArray.Add(pair); hashTable[hash] = overlappingPairArray.Count - 1; return(pair); }
public void collide(Dispatcher dispatcher) { DbvtTreeCollider collider = new DbvtTreeCollider(this); //collide dynamics: { Dbvt.collideTT(sets[DYNAMIC_SET].root, sets[FIXED_SET].root, dispatcher, collider); Dbvt.collideTT(sets[DYNAMIC_SET].root, sets[DYNAMIC_SET].root, dispatcher, collider); } //dynamic -> fixed set: DbvtProxy current = stageRoots[DYNAMIC_SET]; while (current != null) { stageRoots[DYNAMIC_SET] = listremove(current, stageRoots[DYNAMIC_SET]); stageRoots[FIXED_SET] = listappend(current, stageRoots[FIXED_SET]); DbvtAabbMm volume = current.leaf.volume; sets[DYNAMIC_SET].remove(current.leaf); current.leaf = sets[FIXED_SET].insert(volume, current); current.stage = FIXED_SET; current = stageRoots[DYNAMIC_SET]; } // clean up: { List <BroadphasePair> pairs = paircache.getOverlappingPairArray(); if (pairs.Count > 0) { for (int i = 0, ni = pairs.Count; i < ni; i++) { BroadphasePair p = pairs[i]; DbvtProxy pa = (DbvtProxy)p.pProxy0; DbvtProxy pb = (DbvtProxy)p.pProxy1; if (!DbvtAabbMm.Intersect(pa.leaf.volume, pb.leaf.volume)) { if (pa.getUid() > pb.getUid()) { DbvtProxy tmp = pa; pa = pb; pb = tmp; } paircache.removeOverlappingPair(pa, pb); ni--; i--; } } } } }
public override void processAllOverlappingPairs(OverlapCallback callback) { for (int i = 0; i < overlappingPairArray.Count;) { BroadphasePair pair = overlappingPairArray[i]; if (callback.processOverlap(pair)) { removeOverlappingPair(pair.pProxy0, pair.pProxy1); } else { i++; } } }
public override void removeOverlappingPair(BroadphaseProxy proxy0, BroadphaseProxy proxy1) { if (proxy0.getUid() > proxy1.getUid()) { BroadphaseProxy tmp = proxy0; proxy0 = proxy1; proxy1 = tmp; } UUID proxyId1 = proxy0.getUid(); UUID proxyId2 = proxy1.getUid(); int hash = getHash(proxyId1, proxyId2); BroadphasePair pair = internalFindPair(proxy0, proxy1, hash); if (pair == null) { return; } int pairIndex = hashTable[hash]; // Remove the pair from the hash table. hashTable.Remove(hash); // We now move the last pair into spot of the // pair being removed. We need to fix the hash // table indices to support the move. int lastPairIndex = overlappingPairArray.Count - 1; // If the removed pair is the last pair, we are done. if (lastPairIndex == pairIndex) { overlappingPairArray.RemoveAt(overlappingPairArray.Count - 1); return; } BroadphasePair last = overlappingPairArray[lastPairIndex]; overlappingPairArray[pairIndex] = overlappingPairArray[lastPairIndex]; overlappingPairArray.RemoveAt(lastPairIndex); int lastHash = getHash(last.pProxy0.getUid(), last.pProxy1.getUid()); hashTable[lastHash] = pairIndex; }
public override bool processOverlap(BroadphasePair pair) { dispatcher.getNearCallback().handleCollision(pair, dispatcher); return(false); }
public override bool processOverlap(BroadphasePair pair) { return((pair.pProxy0 == obsoleteProxy) || (pair.pProxy1 == obsoleteProxy)); }
private bool equalsPair(BroadphasePair pair, UUID proxyId1, UUID proxyId2) { return(pair.pProxy0.getUid() == proxyId1 && pair.pProxy1.getUid() == proxyId2); }