Пример #1
0
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;
}