/*Copyright (C) 2010 Deveaux Duncan

This file is part of Hikou no mizu.

Hikou no mizu is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Hikou no mizu is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with Hikou no mizu.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "MoteurPhysique.hpp"
#include <iostream>

MoteurPhysique::MoteurPhysique()
{
	
}

void MoteurPhysique::ajouteObjet(ObjetPhysique *pObjet)
{
	listeObjetsPhysiques.push_back(pObjet);
}

void MoteurPhysique::supprimeObjet(ObjetPhysique *pObjet)
{
	std::vector<ObjetPhysique*>::iterator it;
	it = std::find(listeObjetsPhysiques.begin(), listeObjetsPhysiques.end(), pObjet);
	
	if (it != listeObjetsPhysiques.end())
		listeObjetsPhysiques.erase(it);
}

void MoteurPhysique::deplaceObjet(ObjetPhysique *pObjetADeplacer, float pPositionX)
{
	float oldX = pObjetADeplacer->getPositionX();
	pObjetADeplacer->setPositionX(pPositionX);
	
	if (testCollision(pObjetADeplacer) != NULL)
		pObjetADeplacer->setPositionX(oldX);
}

ObjetPhysique *MoteurPhysique::testCollision(ObjetPhysique *pObjetATester)
{
	//Position qui utilisent le point d'origine haut gauche de l'objet
	float positionX = pObjetATester->getPositionX() - pObjetATester->getOrigin().x;
	float positionY = pObjetATester->getPositionY() - pObjetATester->getOrigin().y;
	float largeur = pObjetATester->getLargeur();
	float hauteur = pObjetATester->getHauteur();
	
	for (int i = 0; i < listeObjetsPhysiques.size(); i++)
	{
		if (pObjetATester != listeObjetsPhysiques[i])
		{
			float positionXObjetTest = listeObjetsPhysiques[i]->getPositionX() - listeObjetsPhysiques[i]->getOrigin().x;
			float positionYObjetTest = listeObjetsPhysiques[i]->getPositionY() - listeObjetsPhysiques[i]->getOrigin().y;
			float largeurObjetTest = listeObjetsPhysiques[i]->getLargeur();
			float hauteurObjetTest = listeObjetsPhysiques[i]->getHauteur();
			
			if ((positionX + largeur >= positionXObjetTest && positionX <= positionXObjetTest + largeurObjetTest) && (positionY + hauteur >= positionYObjetTest && positionY <= positionYObjetTest + hauteurObjetTest))
				return listeObjetsPhysiques[i];
		}
	}
	
	return NULL;
}
