/* Since we know the particles that are close to this one we can do collision
 * collision detection with the nearby particles
 * The collision 'mirror' reflection was taken from a paper that uses the twice
 * the checking distance for collision, the distance to the collision, the normal
 * it is similar to a perfect mirror reflection but through testing looks better
 * for water
 */
void FluidParticle::collisionDetection(FluidParticle *fluidParticles, int numParticles, float timeStep) {
    // Check Bounding Box
    float dist;
    for(int i = 0; i < numParticles; i++) {
        if(this->id != fluidParticles[i].id) {
            dist = glm::length(this->pos - fluidParticles[i].pos);
            if(dist < MAX_DISTANCE) {
                collisionHandle(fluidParticles[i], dist);
            }
        }
    }
}
void DynamicsWorld::CollisionImpact( Integration::DynamicsCollisionData* collisionData )
{
    DALI_LOG_INFO(Debug::Filter::gDynamics, Debug::Verbose, "%s\n", __PRETTY_FUNCTION__);

    DALI_ASSERT_DEBUG(collisionData->mBodyA);
    DALI_ASSERT_DEBUG(collisionData->mBodyB);

    if ( !mCollisionSignalV2.Empty() )
    {
        BodyContainer::iterator it = mBodies.begin();
        BodyContainer::iterator endIt = mBodies.end();

        for( ; it != endIt; ++it )
        {
            if( it->first->GetBody() == collisionData->mBodyA )
            {
                BodyContainer::iterator it2 = mBodies.begin();
                for( ; it2 != endIt; ++it2 )
                {
                    if( it2->first->GetBody() == collisionData->mBodyB )
                    {
                        ActorPtr actorA( (*it).second );
                        ActorPtr actorB( (*it2).second );

                        DynamicsCollisionPtr collision( new DynamicsCollision );
                        collision->SetActorA(actorA);
                        collision->SetActorB(actorB);
                        collision->SetPointOnA(collisionData->mPointOnA);
                        collision->SetPointOnB(collisionData->mPointOnB);
                        collision->SetNormal(collisionData->mNormal);
                        collision->SetImpactForce(collisionData->mImpact);

                        Dali::DynamicsCollision collisionHandle( collision.Get() );
                        Dali::DynamicsWorld worldHandle( this );

                        mCollisionSignalV2.Emit( worldHandle, collisionHandle );

                        break;
                    }
                }

                break;
            }
        }
    }
}
void CDynamicSimulator::doSimulation(double dt, double currentTime) {
	
	glColor3f(0,0,0);
	glPointSize(3);
	for(int i=0; i<NPARTICLES; i++) {
		particle[i].simulate(dt, currentTime);
	}

	for(int i=0; i<NPARTICLES; i++) {
		for(int j=i+1; j<NPARTICLES; j++) {
			collisionHandle(particle[i], particle[j]);
		}
	}
	



}