Пример #1
0
        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);
        }
Пример #2
0
        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--;
                        }
                    }
                }
            }
        }
Пример #3
0
 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++;
         }
     }
 }
Пример #4
0
        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;
        }
Пример #5
0
 public override bool processOverlap(BroadphasePair pair)
 {
     dispatcher.getNearCallback().handleCollision(pair, dispatcher);
     return(false);
 }
Пример #6
0
 public override bool processOverlap(BroadphasePair pair)
 {
     return((pair.pProxy0 == obsoleteProxy) ||
            (pair.pProxy1 == obsoleteProxy));
 }
Пример #7
0
 private bool equalsPair(BroadphasePair pair, UUID proxyId1, UUID proxyId2)
 {
     return(pair.pProxy0.getUid() == proxyId1 && pair.pProxy1.getUid() == proxyId2);
 }