#ifndef _TEST_APP
#define _TEST_APP


#include "ofMain.h"
#include "ofxCairo.h"
#include "ofxVectorMath.h"

class Particle {

public:
	
	ofPoint p,v,f;
	float r;
	int c;
	float t, te, alpha;
	Particle() {
	}
	
	void init(float x, float y) {
		r = ofRandom(2, 4);
		
		p.set(x, y, 0);
		v.set(ofRandom(-1.0, 1.0), ofRandom(-1.0, 1.0));
		f.set(ofRandom(-1.0, 1.0), ofRandom(-1.0, 1.0));
		
		c = ofRandom(0, 255);
		te = ofRandom(0, 230);
		t = 0;
		alpha = ofRandom(0, 200);;
	}
	
	void update() {
		t += 0.1;
		f.x += cos(t) * 0.02;
		f.y += sin(t) * 0.02;
		
		v += f;
		p += v;
		
		if(p.x > 200) init(100, 100);
		if(p.x < 30) init(100, 100);		
		if(p.y > 200) init(100, 100);
		if(p.y < 30) init(100, 100);
		
		v *= 0.07;
		r += 0.03;
		if(alpha > 0) alpha -= ofRandom(0.3, 1);
	}
	
	void draw(ofxCairo * cr) {
		ofEnableAlphaBlending();
		cr->setStrokeColor(10, 10, 10, alpha);
		cr->setColor(90, 20, c, alpha);
		cr->circle(p.x, p.y, r);
		ofDisableAlphaBlending();
	}
	
};

class testApp : public ofBaseApp{
	
public:
	
	void setup();
	void update();
	void draw();
	
	void keyPressed  (int key);
	void keyReleased(int key);
	void mouseMoved(int x, int y );
	void mouseDragged(int x, int y, int button);
	void mousePressed(int x, int y, int button);
	void mouseReleased(int x, int y, int button);
	void windowResized(int w, int h);
	
	bool				bOutput;
	ofxCairo			cairo;
	vector <Particle>	particles;
	vector <ofxVec2f>	lines;
};

#endif
