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); } } } } } }
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(); }