// J'implémante ici des forces
// qui sont tres générales
// comme la gravité etc.

#ifndef __M_GENERAL_FORCES_H
#define __M_GENERAL_FORCES_H

#include "m_simulation.h"


class g_Velocity : public Simulation
{
public:
	g_Velocity(float cste) : Simulation(1, 1.0f)						// 1 masse de 1
	{
		m[0]->position = Vector(0.0f, 0.0f, 0.0f);		// une masse a l'origine
		m[0]->velocity  = Vector(cste, 0.0f, 0.0f);		// on met  (1.0f, 0.0f, 0.0f)
	}
};


class g_Accelerate : public Simulation
{
	Vector acceleration
public:
	g_Accelerate(Vector acc) : Simulation(1, 1.0f)						// 1 masse de 1
	{
		acceleration = acc;
		m[0]->position = Vector(0.0f, 0.0f, 0.0f);		// une masse a l'origine
		m[0]->velocity  = Vector(0.0f, 0.0f, 0.0f);		// on met  (1.0f, 0.0f, 0.0f)
	}

	virtual void Solve() 
	{
		for (int a=0;a<nb_masses;a++)
			m[a]->applyForce(acceleration * m[a]->mass);
	}

};

class g_Gravity : public Simulation
{
	float g;
	Vector gravitation; // l'accelération de la gravitation

public:

	g_Gravity(float cste = 9.806650)
	{
		g = cste;
		this->gravitation = Vector(0.0f,0.0f,-g);									//set this class's gravitation
		m[0]->force = gravitation;
	}

	virtual void Solve() 
	{
		for (int a=0;a<nb_masses;a++)
			m[a]->applyForce(gravitation * m[a]->mass);
	}
};


// un ressort
class g_Gravity : public Simulation
{
	float g;
	Vector gravitation; // l'accelération de la gravitation

public:

	g_Gravity(float cste = 9.806650)
	{
		g = cste;
		this->gravitation = Vector(0.0f,0.0f,-g);									//set this class's gravitation
		m[0]->force = gravitation;
	}

	virtual void Solve() 
	{
		for (int a=0;a<nb_masses;a++)
			m[a]->applyForce(gravitation * m[a]->mass);
	}
};

#endif
