#ifndef PARTICLE_H
#define PARTICLE_H

#include "ofMain.h"
#define OF_ADDON_USING_OFXVECTORMATH
#include "ofAddons.h"

class particle
{
    public:
        ofxVec3f pos;
        ofxVec3f vel;
        ofxVec3f frc;   // frc is also know as acceleration (newton says "f=ma")
			
        particle();
		virtual ~particle(){};

        void resetForce();
		void addForce(float x, float y, float z);
		void addRepulsionForce(float x, float y, float z, float radius, float scale);
		void addAttractionForce(float x, float y, float z, float radius, float scale);
		void addCounterClockwiseForce(float x, float y, float z, float radius, float scale);
	
		void addRepulsionForce(particle &p, float radius, float scale);
		void addAttractionForce(particle &p, float radius, float scale);
		void addClockwiseForce(particle &p, float radius, float scale);
		void addCounterClockwiseForce(particle &p, float radius, float scale);
	
		void addCounterClockwiseForceOnAxis(float x, float y, float z, float radius, float scaleX, float scaleY, float scaleZ);
		void addRepulsionForceOnAxis(float x, float y, float z, float radius, float scaleX, float scaleY, float scaleZ);
	
		
		void addDampingForce();
        
		void setInitialCondition(float px, float py, float pz, float vx, float vy, float pz);
        void update();
        void draw();
		void drawTrail();
	
		void bounceOffWalls();
		void bounceOff3dBounds(ofxVec3f xMin, ofxVec3f xMax, ofxVec3f yMin, ofxVec3f yMax, ofxVec3f zMin, ofxVec3f zMax);
	
		float radius;
		float damping;
	
		void addPointToTrail(float x, float y, float z);
		vector <ofxVec3f> trail;
		int maxTrailLength;

    protected:
    private:
};

#endif // PARTICLE_H
