BP_Proxy::BP_Proxy(void *object, BP_Scene& scene, const Ogre::Vector3& min, const Ogre::Vector3& max) : m_object(object), m_scene(scene) { int i; for (i = 0; i < 3; ++i) { new (&m_min[i]) BP_Endpoint(min[i], BP_Endpoint::MINIMUM, this, scene.getLists()[i]); new (&m_max[i]) BP_Endpoint(max[i], BP_Endpoint::MAXIMUM, this, scene.getLists()[i]); } }
void encounters(const BP_Endpoint& a, const BP_Endpoint& b, BP_Scene& scene, T_Overlap overlap) { assert(a.m_proxy != b.m_proxy); if ((a.m_type != b.m_type) && overlap(*a.m_proxy, *b.m_proxy)) { if (a.m_type == BP_Endpoint::MAXIMUM) { scene.callBeginOverlap(a.m_proxy->getObject(), b.m_proxy->getObject()); } else { scene.callEndOverlap(a.m_proxy->getObject(), b.m_proxy->getObject()); } } }
void BP_EndpointList::encounters(const BP_Endpoint& a, const BP_Endpoint& b, BP_Scene& scene, T_Overlap overlap) { assert(a.getProxy() != b.getProxy()); if (a.getType() != b.getType()) { if (a.getType() == BP_Endpoint::MAXIMUM) { if (overlap(*a.getProxy(), *b.getProxy())) { scene.callBeginOverlap(a.getProxy()->getObject(), b.getProxy()->getObject()); } ++a.getCount(); ++b.getCount(); } else { if (overlap(*a.getProxy(), *b.getProxy())) { scene.callEndOverlap(a.getProxy()->getObject(), b.getProxy()->getObject()); } --a.getCount(); --b.getCount(); } } else { if (a.getType() == BP_Endpoint::MAXIMUM) { --a.getCount(); ++b.getCount(); } else { ++a.getCount(); --b.getCount(); } } }