Пример #1
0
void CollisionSystem::update(entityx::EntityManager& entities, entityx::EventManager& events, float dt)
{
    mTestedMap.clear();

    for(auto a : entities.entities_with_components<CNode, CCollider>())
    {
        auto nodeA = a.component<CNode>();
        auto colliderA = a.component<CCollider>();
        auto transformA = nodeA->getWorldTransform();

        if(nodeA->active)
        {
            for(auto b : entities.entities_with_components<CNode, CCollider>())
            {
                auto nodeB = b.component<CNode>();
                auto colliderB = b.component<CCollider>();
                auto transformB = nodeB->getWorldTransform();

                if(nodeB->active && a != b)
                {
                    //If this pair hasn't been tested.
                    if(mTestedMap[a].count(b) == 0)
                    {
                        if(colliderA->getAlignedBounds(transformA).intersects(colliderB->getAlignedBounds(transformB)))
                        {
                            if(intersects(colliderA->getVerts(transformA), colliderB->getVerts(transformB)))
                            {
                                if(colliderA->colliders.count(b) == 0 || colliderB->colliders.count(a) == 0)
                                {
                                    colliderA->colliders.emplace(b);
                                    colliderB->colliders.emplace(a);
                                };
                            }
                            else
                            {
                                colliderA->colliders.erase(b);
                                colliderB->colliders.erase(a);
                            }
                        }
                        else
                        {
                            colliderA->colliders.erase(b);
                            colliderB->colliders.erase(a);
                        }

                        mTestedMap[a].emplace(b);
                        mTestedMap[b].emplace(a);
                    }
                }
            }
        }
    }
}
Пример #2
0
void plDrawableSpans::calcBounds() {
    for (size_t i=0; i<fIcicles.getSize(); i++) {
        hsTArray<plGBufferVertex> verts = getVerts(fIcicles[i]);
        hsBounds3Ext loc;
        hsBounds3Ext world;

        world.setFlags(hsBounds3Ext::kAxisAligned);
        for (size_t j = 0; j < verts.getSize(); j++) {
            loc += verts[j].fPos;
            world += fIcicles[i]->getLocalToWorld().multPoint(verts[j].fPos);
        }
        loc.unalign();

        fIcicles[i]->setLocalBounds(loc);
        fIcicles[i]->setWorldBounds(world);

        if (i == 0)
            fWorldBounds = world;
        else
            fWorldBounds += world;
    }

    fWorldBounds.setFlags(hsBounds3Ext::kAxisAligned);

    fLocalBounds.setMins(fWorldBounds.getMins());
    fLocalBounds.setMaxs(fWorldBounds.getMaxs());
    fLocalBounds.unalign();
}