uniform sampler2D buf0;
uniform float time;
uniform vec2 resolution;
varying vec2 v_texCoord;							
varying vec4 v_fragmentColor;						

////////////////PROCESSINGISTA OTETTU MUISTA LAITTAA CREDISEIHIN///////////

// NEBULA - CoffeeBreakStudios.com (CBS)
// Work in progress...
//
// 3148.26: Switched from classic to simplex noise
// 3148.27: Reduced number of stars
// 3249.0:  Switched to fast computed 3D noise. Less quality but ~ 2x faster
// 3249.5:  Removed use of random number generator to gain performance
// 3265.0:  Added rotation: glsl.heroku.com/e#3005.1

//Utility functions

vec3 fade(vec3 t) {
  return vec3(1.0,1.0,1.0);//t*t*t*(t*(t*6.0-15.0)+10.0);
}

vec2 rotate(vec2 point, float rads) {
	float cs = cos(rads);
	float sn = sin(rads);
	return point * mat2(cs, -sn, sn, cs);
}	

vec4 randomizer4(const vec4 x)
{
    vec4 z = mod(x, vec4(5612.0));
    z = mod(z, vec4(3.1415927 * 2.0));
    return(fract(cos(z) * vec4(56812.5453)));
}

// Fast computed noise
// http://www.gamedev.net/topic/502913-fast-computed-noise/

const float A = 1.0;
const float B = 57.0;
const float C = 113.0;
const vec3 ABC = vec3(A, B, C);
const vec4 A3 = vec4(0, B, C, C+B);
const vec4 A4 = vec4(A, A+B, C+A, C+A+B);

float cnoise4(const in vec3 xx)
{
    vec3 x = mod(xx + 32768.0, 65536.0);
    vec3 ix = floor(x);
    vec3 fx = fract(x);
    vec3 wx = fx*fx*(3.0-2.0*fx);
    float nn = dot(ix, ABC);

    vec4 N1 = nn + A3;
    vec4 N2 = nn + A4;
    vec4 R1 = randomizer4(N1);
    vec4 R2 = randomizer4(N2);
    vec4 R = mix(R1, R2, wx.x);
    float re = mix(mix(R.x, R.y, wx.y), mix(R.z, R.w, wx.y), wx.z);

    return 1.0 - 2.0 * re;
}

float surface3 ( vec3 coord, float frequency )
{
	
	float n = 0.0;	
		
	n += 1.0	* abs( cnoise4( coord * frequency ) );
	n += 0.5	* abs( cnoise4( coord * frequency * 2.0 ) );
	n += 0.25	* abs( cnoise4( coord * frequency * 4.0 ) );
	n += 0.125	* abs( cnoise4( coord * frequency * 8.0 ) );
	n += 0.0625	* abs( cnoise4( coord * frequency * 16.0 ) );
	
	return n;
}

void main()
{
	
	float time_f = (time+160) * 0.1 + 60.0f * 4.0;

	float rads = radians(time_f*1.0);
	vec2 position = gl_FragCoord.xy / resolution.xy;
	position += rotate(position, rads);

	float n = surface3(vec3(position*1.0, time_f * 0.05)*mat3(1,0,0,0,.8,.6,0,-.6,.8),0.2); //vika variable = zoomi

    float lum = length(n) * 1.05; //Tää säätää tummuutta!

	vec3 tc = pow(vec3(1.0-lum),vec3(sin(position.x)+cos(time_f)+4.0,8.0+sin(time_f)+4.0,8.0));
	vec3 curr_color = tc;//(tc*0.8) + (tc2*0.5);
	
	vec4 final_color = vec4(curr_color, 1.0);

	//final_color.a *= 0;

	gl_FragColor = final_color;
}
