var canvas;
var context;
var backcanvas;
var backcontext;
var frameBuffer;
var texture;
var pipe;
var arrowLeft = false;
var arrowUp = false;
var arrowRight = false;
var arrowDown = false;
var spinning = true;
var vertices = new Array();
var angle = 0;
var xangle = 0;
var yangle = 0;

function renderMain()
{
	canvas = document.getElementById("screenbuffer");
	backcanvas = document.createElement('canvas');
	backcanvas.width = canvas.width;
	backcanvas.height = canvas.height;
	context = canvas.getContext("2d");
	backcontext = backcanvas.getContext("2d");
	frameBuffer = backcontext.getImageData(0, 0, backcanvas.width, backcanvas.height);

	pipe = new pipeline();
	pipe.loadtexture("http://chuckskoda.com/JSRender/marble.png");

	document['onkeydown'] = handleKeyDown;
	document['onkeyup'] = handleKeyUp;

	generateCube(vertices);
	drawNext();
}

function drawNext()
{
	angle += .05;
	
	if(arrowLeft)
		yangle += .05;
	else if(arrowRight)
		yangle -= .05;
		
	if(arrowUp)
		xangle += .05;
	else if(arrowDown)
		xangle -= .05;

	if(angle > Math.PI * 2.0 )
		angle -= Math.PI * 2.0;
	if(yangle > Math.PI * 2.0 )
		yangle -= Math.PI * 2.0;
	if(xangle > Math.PI * 2.0 )
		xangle -= Math.PI * 2.0;

	var axis = new vector(1.0, 4.2, 10.0);
	axis.normalize();

	var World = TranslationMatrix(new vector(0.0, 0.0, 4.0));
	var Rot;
	var Cam = LookRotationMatrix(new vector(0.0, 1.0, 0.0), new vector(0.0, 0.0, 1.0));
	var View = TranslationMatrix(new vector(0.0, 0.0, 0.0));
	var Persp = ProjectionMatrix(Math.PI / 4.0, frameBuffer.width / frameBuffer.height);

	if(spinning)
	{
		Rot = AxisRotationMatrix(axis, angle); 
	}
	else
	{
		axis = new vector(0.0, 1.0, 0.0);
		var Rot = AxisRotationMatrix(axis, yangle);
		axis = new vector(1.0, 0.0, 0.0);
		Rot.mul_eq(AxisRotationMatrix(axis, xangle));
	}

	World.mul_eq(Rot);
	View.mul_eq(Cam);

	pipe.world = World;
	pipe.view = View;
	pipe.projection = Persp;

	pipe.light.ambt = new color(.1, .1, .05);
	pipe.light.diff = new color(1.0, 0.9, 0.8);
	pipe.light.spec = new color(0.8, 0.6, 0.3);
	pipe.light.pos = new vector(1.0, 3.0, 0.0);

	pipe.shininess = 30;
	
	pipe.stream = vertices;
	pipe.draw();
	
	pipe.present();
	var t=setTimeout("drawNext()", 1);
}

function generateCube(buf)
{
	buf[0] = new vertex(new vector(0.0,0.0,0.0), new vector(0.0,0.0,0.0), new color(1.0, 1.0, 1.0), new color(1.0, 1.0, 1.0), new texcoord(0.0, 0.0));
	for(var i = 1; i < 36; ++i)
	{
		buf[i] = buf[0].clone();
	}

	//Front
	buf[0].pos = new vector(-0.5, 0.5, -0.5);
	buf[1].pos = new vector(0.5, -0.5, -0.5);
	buf[2].pos = new vector(0.5, 0.5, -0.5);
	buf[3].pos = new vector(-0.5, 0.5, -0.5);
	buf[4].pos = new vector(-0.5, -0.5, -0.5);
	buf[5].pos = new vector(0.5, -0.5, -0.5);
	buf[0].nrm = new vector(0.0, 0.0, -1.0);
	buf[1].nrm = new vector(0.0, 0.0, -1.0);
	buf[2].nrm = new vector(0.0, 0.0, -1.0);
	buf[3].nrm = new vector(0.0, 0.0, -1.0);
	buf[4].nrm = new vector(0.0, 0.0, -1.0);
	buf[5].nrm = new vector(0.0, 0.0, -1.0);

	//Right
	buf[6].pos = new vector(0.5, 0.5, -0.5);
	buf[7].pos = new vector(0.5, -0.5, 0.5);
	buf[8].pos = new vector(0.5, 0.5, 0.5);
	buf[9].pos = new vector(0.5, 0.5, -0.5);
	buf[10].pos = new vector(0.5, -0.5, -0.5);
	buf[11].pos = new vector(0.5, -0.5, 0.5);
	buf[6].nrm = new vector(1.0, 0.0, 0.0);
	buf[7].nrm = new vector(1.0, 0.0, 0.0);
	buf[8].nrm = new vector(1.0, 0.0, 0.0);
	buf[9].nrm = new vector(1.0, 0.0, 0.0);
	buf[10].nrm = new vector(1.0, 0.0, 0.0);
	buf[11].nrm = new vector(1.0, 0.0, 0.0);

	//Back
	buf[12].pos = new vector(0.5, 0.5, 0.5);
	buf[13].pos = new vector(-0.5, -0.5, 0.5);
	buf[14].pos = new vector(-0.5, 0.5, 0.5);
	buf[15].pos = new vector(0.5, 0.5, 0.5);
	buf[16].pos = new vector(0.5, -0.5, 0.5);
	buf[17].pos = new vector(-0.5, -0.5, 0.5);
	buf[12].nrm = new vector(0.0, 0.0, 1.0);
	buf[13].nrm = new vector(0.0, 0.0, 1.0);
	buf[14].nrm = new vector(0.0, 0.0, 1.0);
	buf[15].nrm = new vector(0.0, 0.0, 1.0);
	buf[16].nrm = new vector(0.0, 0.0, 1.0);
	buf[17].nrm = new vector(0.0, 0.0, 1.0);

	//Left
	buf[18].pos = new vector(-0.5, 0.5, 0.5);
	buf[19].pos = new vector(-0.5, -0.5, -0.5);
	buf[20].pos = new vector(-0.5, 0.5, -0.5);
	buf[21].pos = new vector(-0.5, 0.5, 0.5);
	buf[22].pos = new vector(-0.5, -0.5, 0.5);
	buf[23].pos = new vector(-0.5, -0.5, -0.5);
	buf[18].nrm = new vector(-1.0, 0.0, 0.0);
	buf[19].nrm = new vector(-1.0, 0.0, 0.0);
	buf[20].nrm = new vector(-1.0, 0.0, 0.0);
	buf[21].nrm = new vector(-1.0, 0.0, 0.0);
	buf[22].nrm = new vector(-1.0, 0.0, 0.0);
	buf[23].nrm = new vector(-1.0, 0.0, 0.0);

	//Top
	buf[24].pos = new vector(-0.5, 0.5, 0.5);
	buf[25].pos = new vector(0.5, 0.5, -0.5);
	buf[26].pos = new vector(0.5, 0.5, 0.5);
	buf[27].pos = new vector(-0.5, 0.5, 0.5);
	buf[28].pos = new vector(-0.5, 0.5, -0.5);
	buf[29].pos = new vector(0.5, 0.5, -0.5);
	buf[24].nrm = new vector(0.0, 1.0, 0.0);
	buf[25].nrm = new vector(0.0, 1.0, 0.0);
	buf[26].nrm = new vector(0.0, 1.0, 0.0);
	buf[27].nrm = new vector(0.0, 1.0, 0.0);
	buf[28].nrm = new vector(0.0, 1.0, 0.0);
	buf[29].nrm = new vector(0.0, 1.0, 0.0);

	//Bottom
	buf[30].pos = new vector(-0.5, -0.5, -0.5);
	buf[31].pos = new vector(0.5, -0.5, 0.5);
	buf[32].pos = new vector(0.5, -0.5, -0.5);
	buf[33].pos = new vector(-0.5, -0.5, -0.5);
	buf[34].pos = new vector(-0.5, -0.5, 0.5);
	buf[35].pos = new vector(0.5, -0.5, 0.5);
	buf[30].nrm = new vector(0.0, -1.0, 0.0);
	buf[31].nrm = new vector(0.0, -1.0, 0.0);
	buf[32].nrm = new vector(0.0, -1.0, 0.0);
	buf[33].nrm = new vector(0.0, -1.0, 0.0);
	buf[34].nrm = new vector(0.0, -1.0, 0.0);
	buf[35].nrm = new vector(0.0, -1.0, 0.0);

	for(var i = 0; i < 6; ++i)
	{
		buf[i * 6 + 0].diff = new color(1.0, 1.0, 1.0);
		buf[i * 6 + 0].spec = new color(1.0, 1.0, 1.0);
		buf[i * 6 + 0].tex.u = 0.0;
		buf[i * 6 + 0].tex.v = 0.0;

		buf[i * 6 + 1].diff = new color(1.0, 1.0, 1.0);
		buf[i * 6 + 1].spec = new color(1.0, 1.0, 1.0);
		buf[i * 6 + 1].tex.u = 1.0;
		buf[i * 6 + 1].tex.v = 1.0;

		buf[i * 6 + 2].diff = new color(1.0, 1.0, 1.0);
		buf[i * 6 + 2].spec = new color(1.0, 1.0, 1.0);
		buf[i * 6 + 2].tex.u = 1.0;
		buf[i * 6 + 2].tex.v = 0.0;

		buf[i * 6 + 3].diff = new color(1.0, 1.0, 1.0);
		buf[i * 6 + 3].spec = new color(1.0, 1.0, 1.0);
		buf[i * 6 + 3].tex.u = 0.0;
		buf[i * 6 + 3].tex.v = 0.0;

		buf[i * 6 + 4].diff = new color(1.0, 1.0, 1.0);
		buf[i * 6 + 4].spec = new color(1.0, 1.0, 1.0);
		buf[i * 6 + 4].tex.u = 0.0;
		buf[i * 6 + 4].tex.v = 1.0;

		buf[i * 6 + 5].diff = new color(1.0, 1.0, 1.0);
		buf[i * 6 + 5].spec = new color(1.0, 1.0, 1.0);
		buf[i * 6 + 5].tex.u = 1.0;
		buf[i * 6 + 5].tex.v = 1.0;
	}
}

function handleKeyDown(e)
{
	var evt = e || window.event;
	switch(evt.keyCode)
	{
		case 32: spinning = true; break;
		case 37: arrowLeft = true; spinning = false; break;
		case 38: arrowUp = true; spinning = false; break;
		case 39: arrowRight = true; spinning = false; break;
		case 40: arrowDown = true; spinning = false; break;
		default: break;
	}
	
	return document.defaultAction;
}

function handleKeyUp(e)
{
	var evt = e || window.event;
	switch(evt.keyCode)
	{
		case 37: arrowLeft = false; break;
		case 38: arrowUp = false; break;
		case 39: arrowRight = false; break;
		case 40: arrowDown = false; break;
		default: break;
	}
	
	return document.defaultAction;
}
