/*
 * RovastarFractalSpiral.hpp
 *
 *  Created on: Jun 22, 2008
 *      Author: pete
 */
#include "Pipeline.hpp"
#include "Transformation.hpp"
#include "MilkdropCompatability.hpp"
#include "NativePreset.hpp"

class RovastarFractalSpiral : public Pipeline
{
public:

	Border border;

	float dx, dy, cx, cy, time;

	RovastarFractalSpiral() : Pipeline()
	{
		drawables.push_back(&border);

		textureWrap = true;
		screenDecay = 1.0;


		border.outer_size = 0.01;
		border.outer_a = 1.0;
		border.inner_size = 0.02;
		border.inner_a = 1.0;
	}

	virtual void Render(const BeatDetect &music, const PipelineContext &context)
	{
		time = context.time;

		border.outer_r = 0.3 - 0.3*(0.5*sin(time*0.701)+ 0.3*cos(time*0.438));
		border.outer_g = 0.6- 0.4*sin(time*2.924);
		border.outer_b = 0.35 - 0.3*cos(time*0.816);
		cx = 0.5 - 0.1*sin(time*0.342);
		cy = 0.5 + 0.1*sin(time*0.433);

		border.inner_r = 0.5 + 0.5*sin(time*3.034);
		border.inner_g = 0.5 + 0.5*sin(time*2.547);
		border.inner_b = 0.5 + 0.5*sin(time*1.431);
		dx = -0.008*sin(time*0.23);
		dy = -0.008*sin(time*0.2);
	}

	virtual PixelPoint PerPixel(PixelPoint p, const PerPixelContext context)
	{
		float q1 = 8.05+(sin(p.x+0.137*time)-cos(p.y+0.213*time));
		int val1 = abs(p.x*3-0.4*sin(q1));
		int val2 = abs(p.y*3+0.4*sin(q1));
		val1 = val1%2;
		val2 = val2%2;

		float box=(1-context.rad)+ 0.5 * val1 + 0.5*val2;

		float zoom = if_milk(above(box,1),q1*.1,0.998531);
		float rot = if_milk(above(box,1),1*sin(0.385*time),0.02);

		Transforms::Zoom(p,context,zoom,1.01);
		Transforms::Rotate(p,context,rot,cx,cy);
		Transforms::Transform(p,context,dx,dy);

		return p;
	}

};


typedef NativePreset<RovastarFractalSpiral> RovastarFractalSpiralPreset;

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

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