// Newtons.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
#include <SFML/Graphics.hpp>

#include <iostream>

sf::CircleShape object1(20);
sf::CircleShape object2(20);

sf::Vector2f velocity1(200, 150);
sf::Vector2f velocity2(0, 0);
sf::Vector2f force(0, 100);

float mass = 5.0f;
sf::Vector2f acceleration = force / mass;

float mass2 = 10.0f;

sf::Vector2f velocity3(200, 0), velocity4(-100, 0);

void updateFirstLaw(float deltaTime, sf::RenderWindow& window)
{
	object1.move(velocity1 * deltaTime);

	if(object1.getPosition().x < 0 ||
		object1.getPosition().x + object1.getRadius() * 2 > window.getSize().x)
	{
		std::cout << "There is a collision here" << std::endl;
		velocity1.x *= -1;
	}
	if (object1.getPosition().y < 0 ||
		object1.getPosition().y + object1.getRadius() * 2 > window.getSize().y)
	{
		std::cout << "There is a collision here" << std::endl;
		velocity1.y *= -1;
	}
}

void updateSecondLaw(float deltaTime)
{
	velocity2 = velocity2 + acceleration * deltaTime;
	object1.move(velocity2 * deltaTime);
}

void updateThirdLaw(float deltaTime)
{
	if(object2.getGlobalBounds().intersects(object1.getGlobalBounds())) //simple elsastic collision response
	{
		sf::Vector2f newVelocity3 = (velocity3 * (mass - mass2) + 2.0f * mass2 * velocity4) / (mass + mass2);
		sf::Vector2f newVelocity4 = (velocity4 * (mass2 - mass) + 2.0f * mass  * velocity3) / (mass2 + mass);

		velocity3 = newVelocity3;
		velocity4 = newVelocity4;
	}
	object1.move(velocity3 * deltaTime);
	object2.move(velocity4 * deltaTime);
}

int main()
{
	sf::RenderWindow window(sf::VideoMode(800, 600), "Newtons laws");
	sf::Clock clock;
	object1.setPosition(300, 200);
	object2.setPosition(500, 200);

	while(window.isOpen())
	{
		float deltaTime = clock.restart().asSeconds();
		sf::Event event;

		while(window.pollEvent(event))
		{
			if (event.type == sf::Event::Closed)
				window.close();
		}

		window.clear();

		updateThirdLaw(deltaTime);

		window.draw(object1);
		window.draw(object2);

		window.display();
	}
}