void BroadPhase2DHashGrid::_check_motion(Element *p_elem) { for (Map<Element*,PairData*>::Element *E=p_elem->paired.front();E;E=E->next()) { bool pairing = p_elem->aabb.intersects( E->key()->aabb ); if (pairing!=E->get()->colliding) { if (pairing) { if (pair_callback) { E->get()->ud=pair_callback(p_elem->owner,p_elem->subindex,E->key()->owner,E->key()->subindex,pair_userdata); } } else { if (unpair_callback) { unpair_callback(p_elem->owner,p_elem->subindex,E->key()->owner,E->key()->subindex,E->get()->ud,unpair_userdata); } } E->get()->colliding=pairing; } } }
void BroadPhaseBasic::update() { // recompute pairs for (Map<ID, Element>::Element *I = element_map.front(); I; I = I->next()) { for (Map<ID, Element>::Element *J = I->next(); J; J = J->next()) { Element *elem_A = &I->get(); Element *elem_B = &J->get(); if (elem_A->owner == elem_B->owner) continue; bool pair_ok = elem_A->aabb.intersects(elem_B->aabb) && (!elem_A->_static || !elem_B->_static); PairKey key(I->key(), J->key()); Map<PairKey, void *>::Element *E = pair_map.find(key); if (!pair_ok && E) { if (unpair_callback) unpair_callback(elem_A->owner, elem_A->subindex, elem_B->owner, elem_B->subindex, E->get(), unpair_userdata); pair_map.erase(key); } if (pair_ok && !E) { void *data = NULL; if (pair_callback) data = pair_callback(elem_A->owner, elem_A->subindex, elem_B->owner, elem_B->subindex, unpair_userdata); pair_map.insert(key, data); } } } }