#version 120
uniform sampler2D texture[2];
uniform float cycles[5];
uniform float temperature;

varying float distortion;
varying vec2 uv;
varying vec3 normal;
varying vec3 v;

const float maxVariance = 0.03; //should be kept low
const float deviationCycles = 3.25; //How much variation is based on base color

const float two_pi = 6.28318531;

const float noise1Base = 0.84, noise1Range = 0.25;
const float noise2Base = 0.93, noise2Range = 0.34;

const float diffPower = 2.3;
const float tempInfluence = 0.25;
const float baseTemp = 10000.0;

const float noiseOffsetNoise = 0.1;

float mixRange(float x, float low, float hi) {
	return clamp((x - low) / (hi - low), 0.0, 1.0);
}

vec3 blackBody(float temp) {
	vec3 c;
	c.r = mix(1.0, 0.6234, mixRange(temp, 6400.0, 29800.0));
	c.b = mix(0.0, 1.0, mixRange(temp, 2800.0, 7600.0));
	if(temp < 6600.0)
		c.g = mix(0.22, 0.976, mixRange(temp, 1000.0, 6600.0));
	else
		c.g = mix(0.976, 0.75, mixRange(temp, 6600.0, 29800.0));
	return c;
}

void main() {
	vec2 noiseCoord = uv * 3.0 + (texture2D(texture[1], uv * 16.0).xz - vec2(0.5)) * noiseOffsetNoise;
	noiseCoord += vec2( cycles[0], cycles[1]);
	
	vec2 noise2Coord = noiseCoord + vec2( -cycles[3], cycles[4] );
	vec2 noise3Coord = noiseCoord + vec2( -cycles[2], cycles[3] * 4.0 );
	vec2 noise4Coord = noiseCoord * 2.0 + vec2( cycles[4], cycles[0] * -2.0 );
	
	noiseCoord += vec2( cycles[1], cycles[2] );
	
	float heat;
	heat =	noise1Base + noise1Range *
		mix(texture2D(texture[1], uv * 4.0).r, texture2D(texture[1], noiseCoord, 20.0 * distortion).r, distortion);
	heat *=	noise2Base + noise2Range *
		mix(texture2D(texture[0], noise2Coord).g, texture2D(texture[0], noise2Coord, 20.0 * distortion).g, distortion);
	heat *=	noise2Base + noise2Range *
		mix(texture2D(texture[0], noise3Coord).b, texture2D(texture[0], noise3Coord, 20.0 * distortion).r, distortion);
	heat *=	noise1Base + noise1Range *
		mix(texture2D(texture[1], noise4Coord).g, texture2D(texture[1], noise4Coord, 20.0 * distortion).b, distortion);
	heat = (heat - 1.1);
	if(temperature < 4500.0 || temperature > 6000.0) {
		if(heat < 0.0)
			heat *= 2.0;
		else
			heat *= 8.0;
	}
	else {
		heat *= 4.0;
	}
	
	heat = heat * pow(max(dot(normalize(normal), vec3(0.0,0.0,1.0)), 0.0), 1.7) + 1.0;
	
	gl_FragColor.rgb = blackBody(temperature * heat) * clamp(heat, min(temperature / 2500.0, 1.0), 1.0);
	gl_FragColor.a = 1.0;
}
