void btDbvtBroadphase::destroyProxy( btBroadphaseProxy* absproxy,btDispatcher* dispatcher) { btDbvtProxy* proxy=(btDbvtProxy*)absproxy; if(proxy->stage==STAGECOUNT) m_sets[1].remove(proxy->leaf); else m_sets[0].remove(proxy->leaf); listremove(proxy,m_stageRoots[proxy->stage]); m_paircache->removeOverlappingPairsContainingProxy(proxy,dispatcher); btAlignedFree(proxy); m_needcleanup=true; }
int listdelete(List* l, elem_t e) { int found = 0; if(l != NULL) { int i; /* Walk backward */ for(i=l->length-1;i>=0;i--) { found = 1; if(l->content[i] == e) listremove(l,i); } } return found; }
static FrList *symtab_delete(istream &in,const FrList *symtabs) { FrSymbol *sym = get_symbol(cout,in,"FrSymbol table's name:") ; FrSymbolTable *old_symtab = FrSymbolTable::selectDefault() ; FrCons *assoc = listassoc(symtabs,sym,equal) ; if (assoc) { old_symtab->select() ; destroy_symbol_table((FrSymbolTable *)assoc->cdr()) ; return listremove(symtabs,assoc,equal) ; } else { cout << "\nYou have not defined a symbol table by that name!" << endl ; old_symtab->select() ; return (FrList *)symtabs ; } }
void btDbvtBroadphase::setAabbForceUpdate(btBroadphaseProxy* absproxy, const btVector3& aabbMin, const btVector3& aabbMax, btDispatcher* /*dispatcher*/) { btDbvtProxy* proxy = (btDbvtProxy*)absproxy; ATTRIBUTE_ALIGNED16(btDbvtVolume) aabb = btDbvtVolume::FromMM(aabbMin, aabbMax); bool docollide = false; if (proxy->stage == STAGECOUNT) { /* fixed -> dynamic set */ m_sets[1].remove(proxy->leaf); proxy->leaf = m_sets[0].insert(aabb, proxy); docollide = true; } else { /* dynamic set */ ++m_updates_call; /* Teleporting */ m_sets[0].update(proxy->leaf, aabb); ++m_updates_done; docollide = true; } listremove(proxy, m_stageRoots[proxy->stage]); proxy->m_aabbMin = aabbMin; proxy->m_aabbMax = aabbMax; proxy->stage = m_stageCurrent; listappend(proxy, m_stageRoots[m_stageCurrent]); if (docollide) { m_needcleanup = true; if (!m_deferedcollide) { btDbvtTreeCollider collider(this); m_sets[1].collideTTpersistentStack(m_sets[1].m_root, proxy->leaf, collider); m_sets[0].collideTTpersistentStack(m_sets[0].m_root, proxy->leaf, collider); } } }
void btDbvtBroadphase::collide(btDispatcher* dispatcher) { /*printf("---------------------------------------------------------\n"); printf("m_sets[0].m_leaves=%d\n",m_sets[0].m_leaves); printf("m_sets[1].m_leaves=%d\n",m_sets[1].m_leaves); printf("numPairs = %d\n",getOverlappingPairCache()->getNumOverlappingPairs()); { int i; for (i=0;i<getOverlappingPairCache()->getNumOverlappingPairs();i++) { printf("pair[%d]=(%d,%d),",i,getOverlappingPairCache()->getOverlappingPairArray()[i].m_pProxy0->getUid(), getOverlappingPairCache()->getOverlappingPairArray()[i].m_pProxy1->getUid()); } printf("\n"); } */ SPC(m_profiling.m_total); /* optimize */ m_sets[0].optimizeIncremental(1 + (m_sets[0].m_leaves * m_dupdates) / 100); if (m_fixedleft) { const int count = 1 + (m_sets[1].m_leaves * m_fupdates) / 100; m_sets[1].optimizeIncremental(1 + (m_sets[1].m_leaves * m_fupdates) / 100); m_fixedleft = btMax<int>(0, m_fixedleft - count); } /* dynamic -> fixed set */ m_stageCurrent = (m_stageCurrent + 1) % STAGECOUNT; btDbvtProxy* current = m_stageRoots[m_stageCurrent]; if (current) { #if DBVT_BP_ACCURATESLEEPING btDbvtTreeCollider collider(this); #endif do { btDbvtProxy* next = current->links[1]; listremove(current, m_stageRoots[current->stage]); listappend(current, m_stageRoots[STAGECOUNT]); #if DBVT_BP_ACCURATESLEEPING m_paircache->removeOverlappingPairsContainingProxy(current, dispatcher); collider.proxy = current; btDbvt::collideTV(m_sets[0].m_root, current->aabb, collider); btDbvt::collideTV(m_sets[1].m_root, current->aabb, collider); #endif m_sets[0].remove(current->leaf); ATTRIBUTE_ALIGNED16(btDbvtVolume) curAabb = btDbvtVolume::FromMM(current->m_aabbMin, current->m_aabbMax); current->leaf = m_sets[1].insert(curAabb, current); current->stage = STAGECOUNT; current = next; } while (current); m_fixedleft = m_sets[1].m_leaves; m_needcleanup = true; } /* collide dynamics */ { btDbvtTreeCollider collider(this); if (m_deferedcollide) { SPC(m_profiling.m_fdcollide); m_sets[0].collideTTpersistentStack(m_sets[0].m_root, m_sets[1].m_root, collider); } if (m_deferedcollide) { SPC(m_profiling.m_ddcollide); m_sets[0].collideTTpersistentStack(m_sets[0].m_root, m_sets[0].m_root, collider); } } /* clean up */ if (m_needcleanup) { SPC(m_profiling.m_cleanup); btBroadphasePairArray& pairs = m_paircache->getOverlappingPairArray(); if (pairs.size() > 0) { int ni = btMin(pairs.size(), btMax<int>(m_newpairs, (pairs.size() * m_cupdates) / 100)); for (int i = 0; i < ni; ++i) { btBroadphasePair& p = pairs[(m_cid + i) % pairs.size()]; btDbvtProxy* pa = (btDbvtProxy*)p.m_pProxy0; btDbvtProxy* pb = (btDbvtProxy*)p.m_pProxy1; if (!Intersect(pa->leaf->volume, pb->leaf->volume)) { #if DBVT_BP_SORTPAIRS if (pa->m_uniqueId > pb->m_uniqueId) btSwap(pa, pb); #endif m_paircache->removeOverlappingPair(pa, pb, dispatcher); --ni; --i; } } if (pairs.size() > 0) m_cid = (m_cid + ni) % pairs.size(); else m_cid = 0; } } ++m_pid; m_newpairs = 1; m_needcleanup = false; if (m_updates_call > 0) { m_updates_ratio = m_updates_done / (btScalar)m_updates_call; } else { m_updates_ratio = 0; } m_updates_done /= 2; m_updates_call /= 2; }
void btDbvtBroadphase::setAabb(btBroadphaseProxy* absproxy, const btVector3& aabbMin, const btVector3& aabbMax, btDispatcher* /*dispatcher*/) { btDbvtProxy* proxy = (btDbvtProxy*)absproxy; ATTRIBUTE_ALIGNED16(btDbvtVolume) aabb = btDbvtVolume::FromMM(aabbMin, aabbMax); #if DBVT_BP_PREVENTFALSEUPDATE if (NotEqual(aabb, proxy->leaf->volume)) #endif { bool docollide = false; if (proxy->stage == STAGECOUNT) { /* fixed -> dynamic set */ m_sets[1].remove(proxy->leaf); proxy->leaf = m_sets[0].insert(aabb, proxy); docollide = true; } else { /* dynamic set */ ++m_updates_call; if (Intersect(proxy->leaf->volume, aabb)) { /* Moving */ const btVector3 delta = aabbMin - proxy->m_aabbMin; btVector3 velocity(((proxy->m_aabbMax - proxy->m_aabbMin) / 2) * m_prediction); if (delta[0] < 0) velocity[0] = -velocity[0]; if (delta[1] < 0) velocity[1] = -velocity[1]; if (delta[2] < 0) velocity[2] = -velocity[2]; if ( m_sets[0].update(proxy->leaf, aabb, velocity, gDbvtMargin) ) { ++m_updates_done; docollide = true; } } else { /* Teleporting */ m_sets[0].update(proxy->leaf, aabb); ++m_updates_done; docollide = true; } } listremove(proxy, m_stageRoots[proxy->stage]); proxy->m_aabbMin = aabbMin; proxy->m_aabbMax = aabbMax; proxy->stage = m_stageCurrent; listappend(proxy, m_stageRoots[m_stageCurrent]); if (docollide) { m_needcleanup = true; if (!m_deferedcollide) { btDbvtTreeCollider collider(this); m_sets[1].collideTTpersistentStack(m_sets[1].m_root, proxy->leaf, collider); m_sets[0].collideTTpersistentStack(m_sets[0].m_root, proxy->leaf, collider); } } } }