function Vertex(px,py,pz)
{
	this.x = px;
	this.y = py;
	this.z = pz;

	this.rx = 0;
	this.ry = 0;
	this.rz = 0;
}
function Polygon(pr,pg,pb,pv)
{
	this.r = pr;
	this.g = pg;
	this.b = pb;
	this.v = pv;
}


var currentPoly = new Array();


var ProjMatrix = null;
var ModelMatrix = null;

function glBegin(ctx)
{
	ctx.beginPath();
	ctx.moveTo(0,0);
}

function glEnd(ctx)
{
	drawPoly();
	currentPoly = new Array();

	ctx.stroke();
	ctx.fill();
	ctx.closePath();
}

function glVertex3(x,y,z)
{
	currentPoly[currentPoly.length] = new Vertex(x,y,z);
}
function glVertex(v)
{
	currentPoly[currentPoly.length] = v;
}
function drawPoly()
{
	var sX = 0;
	var sY = 0;

	for(i = 0; i < currentPoly.length; i++)
	{
		var rx = currentPoly[i].x * ProjMatrix[0] + currentPoly[i].y * ProjMatrix[1] + currentPoly[i].z * ProjMatrix[2];
		var ry = currentPoly[i].x * ProjMatrix[4] + currentPoly[i].y * ProjMatrix[5] + currentPoly[i].z * ProjMatrix[6];
		var rz = currentPoly[i].x * ProjMatrix[8] + currentPoly[i].y * ProjMatrix[9] + currentPoly[i].z * ProjMatrix[10];

		currentPoly[i].rx = rx * ModelMatrix[0] + ry * ModelMatrix[1] + rz * ModelMatrix[2];
		currentPoly[i].ry = rx * ModelMatrix[4] + ry * ModelMatrix[5] + rz * ModelMatrix[6];
		currentPoly[i].rz = rx * ModelMatrix[8] + ry * ModelMatrix[9] + rz * ModelMatrix[10]+50;
	}

	var rx1 = currentPoly[1].rx - currentPoly[0].rx;
	var ry1 = currentPoly[1].ry - currentPoly[0].ry;
	var rz1 = currentPoly[1].rz - currentPoly[0].rz;
	
	var rx2 = currentPoly[2].rx - currentPoly[0].rx;
	var ry2 = currentPoly[2].ry - currentPoly[0].ry;
	var rz2 = currentPoly[2].rz - currentPoly[0].rz;

	var a = ry1*rz2-ry2*rz1;
	var b = rz1*rx2-rz2*rx1;
	var c = rx1*ry2-rx2*ry1;

	var l = Math.sqrt(a*a+b*b+c*c);
	var d = 1;
	if(l != 0)
	{
		a/=l;
		b/=l;
		c/=l;
		d = a*currentPoly[1].rx+b*currentPoly[1].ry+c*currentPoly[1].rz;

		if(a+b+c-d<=0)
		{
			return;
		}
	}

	for(i = 0; i < currentPoly.length; i++)
	{
		var x = Math.floor((currentPoly[i].rx*250) / (currentPoly[i].rz) + 150);
		var y = Math.floor((currentPoly[i].ry*250) / (currentPoly[i].rz) + 150);

		if(i == 0)
		{
			ctx.moveTo(x,y);
			sX = x;
			sY = y;
		}
		else
			ctx.lineTo(x,y);
	}
	ctx.lineTo(sX,sY);
}
function glLoadIdentity()
{
	return Array(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1);
}

function glRotatef(amount, x,y,z)
{
	var c = Math.cos(amount);
	var s = Math.sin(amount);
	
	return Array(
			x*x*(1-c)+c,		x*y*(1-c)-z*s,		x*z*(1-c)+y*s,		0,
			y*x*(1-c)+z*s,		y*y*(1-c)+c,		y*z*(1-c)-x*s,		0,
			x*z*(1-c)-y*s,		y*z*(1-c)+x*s,		z*z*(1-c)+c,		0,
			0,					0,					0,					1);
}

function glColor3(ctx, r,g,b)
{
	ctx.fillStyle = 'rgba('+r+','+g+','+b+',1)';
	ctx.strokeStyle = 'rgba('+r+','+g+','+b+',1)';
}

function glMatrixMult(m1, m2)
{
	var newMatrix = new Array();
	newMatrix[0] = m1[0]*m2[0] + m1[4]*m2[1] + m1[8]*m2[2];
	newMatrix[1] = m1[1]*m2[0] + m1[5]*m2[1] + m1[9]*m2[2];
	newMatrix[2] = m1[2]*m2[0] + m1[6]*m2[1] + m1[10]*m2[2];
	newMatrix[3] = 0;
	
	newMatrix[4] = m1[0]*m2[4] + m1[4]*m2[5] + m1[8]*m2[6];
	newMatrix[5] = m1[1]*m2[4] + m1[5]*m2[5] + m1[9]*m2[6];
	newMatrix[6] = m1[2]*m2[4] + m1[6]*m2[5] + m1[10]*m2[6];
	newMatrix[7] = 0;
	
	newMatrix[8] = m1[0]*m2[8] + m1[4]*m2[9] + m1[8]*m2[10];
	newMatrix[9] = m1[1]*m2[8] + m1[5]*m2[9] + m1[9]*m2[10];
	newMatrix[10] = m1[2]*m2[8] + m1[6]*m2[9] + m1[10]*m2[10];
	newMatrix[11] = 0;
	
	newMatrix[12] = m1[0]*m2[12] + m1[4]*m2[13] + m1[8]*m2[14] + m1[12];
	newMatrix[13] = m1[1]*m2[12] + m1[5]*m2[13] + m1[9]*m2[14] + m1[13];
	newMatrix[14] = m1[2]*m2[12] + m1[6]*m2[13] + m1[10]*m2[14] + m1[14];
	newMatrix[15] = 1;
	return newMatrix;
}

