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;
		}
	}
}
Beispiel #2
0
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);
			}
		}
	}
}