/*
 * RovastarFractalSpiral.hpp
 *
 *  Created on: Jun 22, 2008
 *      Author: pete
 */


#include "Pipeline.hpp"
#include "Transformation.hpp"
#include "MilkdropCompatability.hpp"
#include "VideoEcho.hpp"
#include "NativePreset.hpp"

class RLGFractalDrop7c : public Pipeline
{
public:

	Shape shape1,shape2,shape3,shape4;
	MilkdropWaveform wave;
	VideoEcho videoEcho;

	float movement, t1, t2, t3, t4;

	RLGFractalDrop7c() : Pipeline()
	{
		drawables.push_back(&shape1);
		drawables.push_back(&shape2);
		drawables.push_back(&shape3);
		drawables.push_back(&shape4);
		drawables.push_back(&wave);

		compositeDrawables.push_back(&videoEcho);

		textureWrap = true;
		screenDecay = 1.0;

		videoEcho.orientation = FlipX;
		videoEcho.zoom = 1.006752;
		videoEcho.a = 0.5;

		wave.mode = DoubleLine;
		wave.additive = true;
		wave.scale = 3.815202;
		wave.smoothing = 0.9;
		wave.modOpacityEnd = 1.1;
		wave.modOpacityStart = 0.0;
		wave.maximizeColors = true;
		wave.modulateAlphaByVolume = true;
		wave.r = 0.65;
		wave.g = 0.65;
		wave.b = 1;
		wave.a = 0.1;

		movement = 0;

		t1 = (rand()%100)*0.01;
		t2 = (rand()%100)*0.01;
		t3 = (rand()%100)*0.01;
		t4 = (rand()%100)*0.01;

		shape1.sides =3;
		shape1.x = 0.37;
		shape1.y = 0.5;
		shape1.radius = 6.811289;
		shape1.ang = 3.644249;
		shape1.a = 0.5;
		shape1.a2 = 0.5;
		shape1.border_r = 1;
		shape1.border_g = 1;
		shape1.border_b = 1;
		shape1.border_a = 1;

		shape2.sides =100;
		shape2.additive = true;
		shape2.textured = true;

		shape2.radius = 0.897961;
		shape2.ang = 3.644249;
		shape2.a = 0.5;
		shape2.a2 = 1;

		shape3.sides =100;
		shape3.additive = true;
		shape3.textured = true;
		shape3.radius = 0.513861;
		shape3.ang = 4.209736;
		shape3.a = 1;
		shape3.a2 = 1;

		shape4.sides =100;
		shape4.additive = true;
		shape4.textured = true;
		shape4.ang = 0;
		shape4.a = 1;
		shape4.r = 0.6;
		shape4.g = 0.8;
		shape4.b = 1;
		shape4.a2 = 1;
	}

	virtual void Render(const BeatDetect &music, const PipelineContext &context)
	{
		movement += 0.1*max(0,music.bass+music.bass_att-2) + 0.15*pow(music.bass,3) + 0.005;
		float time = context.time;

		shape1.ang = movement*(0.303 + 0.01*t1);
		shape1.r = min(1,max(0,0+ 0.1*sin(time*0.417 + 1)));
		shape1.g = min(1,max(0,0 + 0.1*sin(time*0.391 + 2)));
		shape1.b = min(1,max(0,0 + 0.1*sin(time*0.432 + 4)));
		shape1.r2 = min(1,max(0, 0.02*sin(time*0.657 + 3)));
		shape1.g2 = min(1,max(0, 0.02*sin(time*0.737 + 5)));
		shape1.b2 = min(1,max(0, 0.02*sin(time*0.884 + 6)));
		shape1.additive = ((0.5+0.15*(music.bass+music.bass_att)) > 1.0) ? true : false;


		shape2.x = 0.37 + 0.07*sin(movement*0.15+3);
		shape2.y = 0.5 + 0.03*sin(movement*0.19+1);
		shape2.tex_ang = movement*(0.01 + 0.0001*t2);
		shape2.r = min(1,max(0, 1 + 0.01*sin(time*0.0417 + 1)));
		shape2.g = min(1,max(0, 1 + 0.01*sin(time*0.391 + 2)));
		shape2.b = min(1,max(0, 1 + 0.01*sin(time*0.432 + 4)));
		shape2.r2 = min(1,max(0, 0.01*sin(time*0.457 + 3)));
		shape2.g2 = min(1,max(0, 0.01*sin(time*0.0437 + 5)));
		shape2.b2 = min(1,max(0, 0.01*sin(time*0.484 + 6)));

		shape3.x = 0.67 + 0.05*sin(movement*0.017);
		shape3.y = 0.43 + 0.09*sin(movement*0.013);
		shape3.tex_ang = movement*(0.02 + 0.0001*t3);
		shape3.radius = 0.222979 * (0.9 + 0.2*t4);
		shape3.r = min(1,max(0,1+ 0.01*sin(time*0.417 + 1)));
		shape3.g = min(1,max(0,1 + 0.01*sin(time*0.391 + 2)));
		shape3.b = min(1,max(0,1 + 0.01*sin(time*0.432 + 4)));
		shape3.r2 = min(1,max(0,0.01*sin(time*0.457 + 3)));
		shape3.g2 = min(1,max(0,0.01*sin(time*0.437 + 5)));
		shape3.b2 = min(1,max(0,0.01*sin(time*0.484 + 6)));

		shape4.x = 0.5 + 0.08*sin(movement*0.25);
		shape4.y = 0.5 + 0.1*sin(movement*0.5+2);
		shape4.ang = time;
	}

	virtual Point PerPixel(Point p, const PerPixelContext context)
	{
		Transforms::Zoom(p,context,1.029902,1.00);
		return p;
	}

};


typedef NativePreset<RLGFractalDrop7> RLGFractalDrop7Preset;

extern "C" RLGFractalDrop7Preset * create(const char * url) {
	return new RLGFractalDrop7Preset(std::string(url));
}

extern "C" void destroy(RLGFractalDrop7Preset * preset) {
    delete preset;
}
