Example #1
0
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;
}
Example #2
0
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
										}
									}
								}
							}
						}

					}
				}

			 }
	}
Example #4
0
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;

					}

					
				}
			}
		}
	}
}