void GhostComponent::checkOverlappingObjects() { int max = ghostObject->getNumOverlappingObjects(); std::set<std::string> currentlyCollidingObjects; for (int i = 0; i < max; i++) { btCollisionObject* collidee = ghostObject->getOverlappingObject(i); PhysicsComponent* component = static_cast<PhysicsComponent*> (collidee->getUserPointer()); std::string colliderName = component->getParent()->getName(); currentlyCollidingObjects.insert(colliderName); std::set<std::string>::iterator colliderIterator = lastKnownColliders.begin(); bool previouslyCollided = false; for (; colliderIterator != lastKnownColliders.end(); colliderIterator++) { if (colliderName == *colliderIterator) { previouslyCollided = true; } } Event* e; if (!previouslyCollided) { e = new Event(Event::COLLISION_ENTER); } else { e = new Event(Event::COLLISION); } e->entity = component->getParent(); this->parent->receiveEvent(e); //delete e; } int setDeltas = lastKnownColliders.size() - currentlyCollidingObjects.size(); if (setDeltas > 0) { // handling exit collisions std::vector<std::string>::iterator it; std::vector<std::string> delta(setDeltas); it = std::set_difference(lastKnownColliders.begin(), lastKnownColliders.end(), currentlyCollidingObjects.begin(), currentlyCollidingObjects.end(), delta.begin()); for (; it != delta.end(); it++) { Entity* exitCollision = ENGINE->getEntity(*it); Event* exitEvent = new Event(Event::COLLISION_EXIT); exitEvent->entity = exitCollision; parent->receiveEvent(exitEvent); delete exitEvent; } //@todo delete events after sending them. Right now they all remain on the heap } lastKnownColliders = currentlyCollidingObjects; }