void PhysicsSystem::ResolveContacts(float deltaTime) { if(contacts.size() == 0) return; ComponentFactory& CF = ComponentFactory::Instance(); if(!CF.hasComponentCache<PhysicsComponent>() || !CF.hasComponentCache<PositionalComponent>() ) //check for any graphicsComponents return; GameObjectCache& GOC = GameObjectCache::Instance(); for (unsigned i=0; i < contacts.size(); i++) { Contact& c = contacts[i]; GameObject* A = GOC.Get(c.ObjIDs[0]); GameObject* B = GOC.Get(c.ObjIDs[1]); PhysicsComponent& APhys = *A->getComponent<PhysicsComponent>(); PositionalComponent& APos = *A->getComponent<PositionalComponent>(); PhysicsComponent& BPhys = *B->getComponent<PhysicsComponent>(); PositionalComponent& BPos = *B->getComponent<PositionalComponent>(); if(APhys.IsGhost || BPhys.IsGhost) //do not move ghost objects continue; ResolvePosition(c, APhys, APos, BPhys, BPos); ResolveVelocities(c, APhys, APos, BPhys, BPos, deltaTime); } }
void ContactResolver::ResolveContacts() { if(!m_contacts.empty()) { InitContacts(); ResolvePosition(); ResolveVelocity(); } }
void ForEach(ToDo todo) { for (auto node : m_resolvers) todo(node.first, ResolvePosition(node.first)); }