bool Physics::CheckCollision(PhysicsComponent *Collider1, PhysicsComponent *Collider2) { //Check what type of collider both the Physics Components have //SPHERE - SPHERE if((strcmp(Collider1->m_colliderType,"sphere") == 0) && (strcmp(Collider2->m_colliderType,"sphere") == 0)) { return SphereSphereCollision(Collider1, Collider2); } //SPHERE - BOX else if((strcmp(Collider1->m_colliderType,"sphere") == 0) && (strcmp(Collider2->m_colliderType,"box") == 0)) { return SphereBoxCollision(Collider1, Collider2); } else if((strcmp(Collider1->m_colliderType,"box") == 0) && (strcmp(Collider2->m_colliderType,"sphere") == 0)) { return SphereBoxCollision(Collider2, Collider1); } // BOX - BOX else if((strcmp(Collider1->m_colliderType,"box") == 0) && (strcmp(Collider2->m_colliderType,"box") == 0)) { return BoxBoxCollision(Collider1, Collider2); } // PlayerCar - BOX else if((strcmp(Collider1->m_colliderType,"playercar") == 0) && (strcmp(Collider2->m_colliderType,"box") == 0)) { return BoxBoxCollision(Collider1, Collider2); } // BOX - PlayerCar else if((strcmp(Collider1->m_colliderType,"box") == 0) && (strcmp(Collider2->m_colliderType,"playercar") == 0)) { return BoxBoxCollision(Collider2, Collider1); } //SPHERE - PlayerCar else if((strcmp(Collider1->m_colliderType,"sphere") == 0) && (strcmp(Collider2->m_colliderType,"playercar") == 0)) { return SphereCarCollision(Collider1, Collider2); } else if((strcmp(Collider1->m_colliderType,"playercar") == 0) && (strcmp(Collider2->m_colliderType,"sphere") == 0)) { return SphereCarCollision(Collider2, Collider1); } return false; }
void PhysicsSystem::SoftBodyCollision() { CollisionData *newData = new CollisionData(); for(vector<PhysicsNode*>::iterator i = allNodes.begin(); i != allNodes.end(); ++i) { PhysicsNode *n1 = (*i); for(vector<PhysicsNode*>::iterator j = clothNodes.begin(); j != clothNodes.end(); ++j) { PhysicsNode *n2 = (*j); if(SphereSphereCollision(*n1->s1,*n2->s1,newData)){ //cout << "Collided!" <<endl; //cout << clothNodes.size() << ":" << allNodes.size() <<endl; //cout << newData->m_normal << ":" << newData->m_penetration <<":" << newData ->m_point <<endl; AddCollisionImpulse(*n1,*n2,newData->m_point,newData->m_normal,newData->m_penetration); n2->hit = true; } else { //cout << "--------"<<endl; } } } delete newData; }
void PhysicsSystem::NarrowPhaseCollisions() { CollisionData *newData = new CollisionData(); //cout << allNodes.size() <<endl; int ccount = 0; int icount = 0; //cout << "Current System N^2 Calculations:" << allNodes.size() << " Total:" << allNodes.size() * allNodes.size() <<endl; for(vector<PhysicsNode*>::iterator i = allNodes.begin(); i != allNodes.end(); ++i) { for(vector<PhysicsNode*>::iterator j = i; j != allNodes.end(); ++j) { if(i != j){ PhysicsNode *n1 = (*i); PhysicsNode *n2 = (*j); if(SphereSphereCollision(*n1->s1,*n2->s1,newData)){ AddCollisionImpulse(*n1,*n2,newData->m_point,newData->m_normal,newData->m_penetration); ccount++; } else { } icount++; } } } delete newData; float ccountf = ccount/100; //cout << fps <<endl; Renderer::GetRenderer().DrawDebugLine(DEBUGDRAW_ORTHO, Vector3(0,30,0),Vector3(ccountf,30,0), Vector3(1,0,0), Vector3(1,0,0)); Renderer::GetRenderer().DrawDebugLine(DEBUGDRAW_ORTHO, Vector3(60,20,0),Vector3(60,40,0), Vector3(0,0,1), Vector3(1,1,0)); Renderer::GetRenderer().DrawDebugLine(DEBUGDRAW_ORTHO, Vector3(120,20,0),Vector3(120,40,0), Vector3(0,0,1), Vector3(1,1,0)); Renderer::GetRenderer().DrawDebugLine(DEBUGDRAW_ORTHO, Vector3(200,20,0),Vector3(200,40,0), Vector3(0,0,1), Vector3(1,1,0)); Renderer::GetRenderer().DrawDebugLine(DEBUGDRAW_ORTHO, Vector3(350,20,0),Vector3(350,40,0), Vector3(0,0,1), Vector3(1,1,0)); Renderer::GetRenderer().DrawDebugLine(DEBUGDRAW_ORTHO, Vector3(500,20,0),Vector3(500,40,0), Vector3(0,0,1), Vector3(1,1,0)); }
void PhysicsSystem::BroadPhaseCollisions() { for(vector<PhysicsNode*>::iterator i = allNodes.begin() ; i != allNodes.end(); ++i) { if((*i)->isPlane) { for(vector<PhysicsNode*>::iterator j = i; j != allNodes.end(); ++j) { if(*i != *j) { c_Sphere c2 = c_Sphere((*j)->GetPosition(), 50); CollisionData cd = CollisionData(); if(SphereInPlane((*j)->GetPosition(), c2.m_radius, c2, &cd)) { AddCollImpulse2(*j, cd); //(*j)->SetLinearVelocity((*j)->GetLinearVelocity()); //Vector3 temp = (*j)->GetLinearVelocity(); //temp.y = -temp.y; //(*j)->SetLinearVelocity(temp); } } } } //Getting the position from and making the spaceship backfire. if(((*i))->isShip && (*i)->isHit == false) { RandPos = (*i)->GetPosition();// + Vector3(100, 100, 100); //hitCount++; } //Check if hit the player/camera. if((*i)->isBackFire) { cubeAABB a = cubeAABB((*i)->GetPosition(), Vector3(100,100,100)); cubeAABB b = cubeAABB(CamPos, Vector3(300, 300, 300)); if(AABBCollision(a, b)){ lifes -= 1; jitter = true; } } for(vector<PhysicsNode*>::iterator j = i; j != allNodes.end(); ++j) { if(*i != *j) { c_Sphere c1 = c_Sphere((*i)->GetPosition(), 50); c_Sphere c2 = c_Sphere((*j)->GetPosition(), 50); CollisionData cd = CollisionData(); if(SphereSphereCollision(c1, c2, &cd) == true){ AddCollisionImpulse(*i, *j, cd); (*i)->m_HasHit = true; if((*i)->isShip == true) { ((*i))->isHit = true; score += 100; pos = ((*i))->GetPosition(); } } // AI if (AI){ if((*i)->isShip && (*j)->isMissile) { if(*i != *j) { Vector3 a = (*i)->GetPosition(); Vector3 b = (*j)->GetPosition(); float diffX = abs(a.x-b.x); float diffY = abs(a.y-b.y); float diffZ = abs(a.z-b.z); Vector3 diff = Vector3(diffX, diffY, diffZ); float sep; sep = (AIlevel == 0) ? 100.0 : 150.0f; if(diff.x <= 100) { if(diff.y <= 100) { if(diff.z <= 100) { (*i)->SetPosition((*i)->GetPosition() + Vector3(100, 100, 100)); RandPos = (*i)->GetPosition() + Vector3(100, 100, 100); } // add force or velo or acce } } } } } } } } }
void PhysicsSystem::BroadPhaseCollisions(vector<PhysicsNode*> &nn) { //Split it up into squares???? for(vector<PhysicsNode*>::iterator i = allNodes.begin(); i != allNodes.end()-1; ++i) { for(vector<PhysicsNode*>::iterator i2 = i; i2 != allNodes.end(); ++i2) { //if(!( ( (*i)->sleep||!(*i)->dynamic) &&((*i2)->sleep||!(*i2)->dynamic) ) ) if((*i)!=(*i2) && (*i)->getCV() != NULL && (*i2)->getCV() != NULL ) { if((*i)->getCV()->GetType() ==COLLISION_SPHERE && (*i2)->getCV()->GetType() ==COLLISION_SPHERE) { CollisionData d; if (SphereSphereCollision(*( (CollisionSphere*) (*i)->getCV()),*( (CollisionSphere*) (*i2)->getCV()),&d)){ collisionStruct cs; cs.p1 = (*i); cs.p2 = (*i2); cs.d = d; (*i)->sleep = false; (*i2)->sleep = false; //c.push_back(cs); PhysicsNode * pNode0 = (*i); PhysicsNode * pNode1 = (*i2); if((*i)->springy== false|| (*i2)->springy== false) AddCollisionImpulse(*cs.p1, *cs.p2,cs.d); nn.push_back(*i); break; } } else if((*i)->getCV()->GetType() ==COLLISION_SPHERE && (*i2)->getCV()->GetType() ==COLLISION_PLANE) { CollisionData d; if(( (CollisionPlane*) (*i2)->getCV())->SphereInPlane(((CollisionSphere*)(*i)->getCV())->m_pos,((CollisionSphere*)(*i)->getCV())->m_radius,&d)) { collisionStruct cs; cs.p1 = (*i); cs.p2 = (*i2); cs.d = d; //c.push_back(cs); PhysicsNode * pNode0 = (*i); PhysicsNode * pNode1 = (*i2); pNode0->sleep = false; pNode1->sleep = false; AddCollisionImpulse(*cs.p1, *cs.p2,cs.d); nn.push_back(*i); break; } } else if((*i)->getCV()->GetType() ==COLLISION_SPHERE && (*i2)->getCV()->GetType() ==COLLISION_HEIGHTMAP) { CollisionData d; if (SphereHeightMapCollision(*(CollisionSphere*)(*i)->getCV(),(*(PhysMap*)(*i2)),&d)){ //(*i)->Stop(); AddCollisionImpulse(*(*i),*(*i2),d); //(*i)->SetY(((PhysMap*)(*i2))->getHeight((*i)->GetPosition().x,(*i)->GetPosition().z) + 25.0f); break; } } } } } }