var canvas;
var gl = null;
var squareVerticesBuffer;
var squareVerticesColorBuffer;
var squareVerticesBuffer2;
var squareVerticesColorBuffer2;
var mvMatrix;
var shaderProgram;
var vertexPositionAttribute;
var perspectiveMatrix;

var vwc = 0;
var vhc = 0;

function startGL(videoCanvas)
{
	if (gl) return true;
	
	canvas = videoCanvas;

	if (!initWebGL(canvas))      // Initialize the GL context
	{
		return false;
	}
	
	if (gl) {
		gl.clearColor(0.0, 0.0, 0.0, 0.0);
		gl.blendFunc(gl.SRC_ALPHA, gl.ZERO);
		gl.enable(gl.BLEND);
		
		initShaders();
		initBuffers(canvas.width, canvas.height);
	}
	
	return true;
}

function initWebGL(cv) {
	//HD resize werkt nog niet
	return false;
	
	try{
		gl = cv.getContext("experimental-webgl");
	}
	catch(e) {
	}
	
	if (gl) { return true; }
	return false;
}

function initBuffers(vw, vh) {
	
	gl.clearColor(0.0, 0.0, 0.0, 0.0);

	if (squareVerticesBuffer)
	{
		gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesBuffer);
		//gl.freeBuffer();
	}
	squareVerticesBuffer = gl.createBuffer();	
	gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesBuffer);
	
	var vww, vhh; vww = vw - 200; vhh = vh - 200;
	var vwx, vhx; vwx = vww / 5; vhx = vhh / 4;
	
	var vertices = [
		100, 100, 0,
		100, 0, 0,
		100 + 0.5 * vwx, 100, 0,
		100 + 0.5 * vwx, 0, 0,
		100 + 1 * vwx, 100, 0,
		100 + 1 * vwx, 0, 0,
		100 + 1.5 * vwx, 100, 0,
		100 + 1.5 * vwx, 0, 0,
		100 + 2 * vwx, 100, 0,
		100 + 2 * vwx, 0, 0,
		100 + 2.5 * vwx, 100, 0,
		100 + 2.5 * vwx, 0, 0,
		100 + 3 * vwx, 100, 0,
		100 + 3 * vwx, 0, 0,
		100 + 3.5 * vwx, 100, 0,
		100 + 3.5 * vwx, 0, 0,
		100 + 4 * vwx, 100, 0,
		100 + 4 * vwx, 0, 0,
		100 + 4.5 * vwx, 100, 0,
		100 + 4.5 * vwx, 0, 0,
		vw - 100, 100, 0,
		vw - 100, 0, 0,
		vw - 100 + Math.cos(Math.PI * 0.4) * 100, 100 - Math.sin(Math.PI * 0.4) * 100, 0,
		vw - 100 + Math.cos(Math.PI * 0.4) * 100, 100 - Math.sin(Math.PI * 0.4) * 100, 0,
		vw - 100, 100, 0,
		vw - 100 + Math.cos(Math.PI * 0.3) * 100, 100 - Math.sin(Math.PI * 0.3) * 100, 0,
		vw - 100, 100, 0,
		vw - 100 + Math.cos(Math.PI * 0.2) * 100, 100 - Math.sin(Math.PI * 0.2) * 100, 0,
		vw - 100, 100, 0,
		vw - 100 + Math.cos(Math.PI * 0.1) * 100, 100 - Math.sin(Math.PI * 0.1) * 100, 0,
		vw - 100, 100, 0,
		vw, 100, 0,
		vw - 100, 100 + 0.5 * vhx, 0,
		vw, 100 + 0.5 * vhx, 0,
		vw - 100, 100 + 1 * vhx, 0,
		vw, 100 + 1 * vhx, 0,
		vw - 100, 100 + 1.5 * vhx, 0,
		vw, 100 + 1.5 * vhx, 0,
		vw - 100, 100 + 2 * vhx, 0,
		vw, 100 + 2 * vhx, 0,
		vw - 100, 100 + 2.5 * vhx, 0,
		vw, 100 + 2.5 * vhx, 0,
		vw - 100, 100 + 3 * vhx, 0,
		vw, 100 + 3 * vhx, 0,
		vw - 100, 100 + 3.5 * vhx, 0,
		vw, 100 + 3.5 * vhx, 0,
		vw - 100, vh - 100, 0,
		vw, vh - 100, 0,
		vw - 100 + Math.cos(Math.PI * 0.1) * 100, vh - 100 + Math.sin(Math.PI * 0.1) * 100, 0,
		vw - 100 + Math.cos(Math.PI * 0.1) * 100, vh - 100 + Math.sin(Math.PI * 0.1) * 100, 0,
		vw - 100, vh - 100, 0,
		vw - 100 + Math.cos(Math.PI * 0.2) * 100, vh - 100 + Math.sin(Math.PI * 0.2) * 100, 0,
		vw - 100, vh - 100, 0,
		vw - 100 + Math.cos(Math.PI * 0.3) * 100, vh - 100 + Math.sin(Math.PI * 0.3) * 100, 0,
		vw - 100, vh - 100, 0,
		vw - 100 + Math.cos(Math.PI * 0.4) * 100, vh - 100 + Math.sin(Math.PI * 0.4) * 100, 0,
		vw - 100, vh - 100, 0,
		vw - 100, vh, 0,
		100 + 4.5 * vwx, vh - 100, 0,
		100 + 4.5 * vwx, vh, 0,
		100 + 4 * vwx, vh - 100, 0,
		100 + 4 * vwx, vh, 0,
		100 + 3.5 * vwx, vh - 100, 0,
		100 + 3.5 * vwx, vh, 0,
		100 + 3 * vwx, vh - 100, 0,
		100 + 3 * vwx, vh, 0,
		100 + 2.5 * vwx, vh - 100, 0,
		100 + 2.5 * vwx, vh, 0,
		100 + 2 * vwx, vh - 100, 0,
		100 + 2 * vwx, vh, 0,
		100 + 1.5 * vwx, vh - 100, 0,
		100 + 1.5 * vwx, vh, 0,
		100 + 1 * vwx, vh - 100, 0,
		100 + 1 * vwx, vh, 0,
		100 + 0.5 * vwx, vh - 100, 0,
		100 + 0.5 * vwx, vh, 0,
		100, vh - 100, 0,
		100, vh, 0,
		100 - Math.cos(Math.PI * 0.4) * 100, vh - 100 + Math.sin(Math.PI * 0.4) * 100, 0,
		100 - Math.cos(Math.PI * 0.4) * 100, vh - 100 + Math.sin(Math.PI * 0.4) * 100, 0,
		100, vh - 100, 0,
		100 - Math.cos(Math.PI * 0.3) * 100, vh - 100 + Math.sin(Math.PI * 0.3) * 100, 0,
		100, vh - 100, 0,
		100 - Math.cos(Math.PI * 0.2) * 100, vh - 100 + Math.sin(Math.PI * 0.2) * 100, 0,
		100, vh - 100, 0,
		100 - Math.cos(Math.PI * 0.1) * 100, vh - 100 + Math.sin(Math.PI * 0.1) * 100, 0,
		100, vh - 100, 0,
		0, vh - 100, 0,
		100, 100 + vhx * 3.5, 0,
		0, 100 + vhx * 3.5, 0,
		100, 100 + vhx * 3, 0,
		0, 100 + vhx * 3, 0,
		100, 100 + vhx * 2.5, 0,
		0, 100 + vhx * 2.5, 0,
		100, 100 + vhx * 2, 0,
		0, 100 + vhx * 2, 0,
		100, 100 + vhx * 1.5, 0,
		0, 100 + vhx * 1.5, 0,
		100, 100 + vhx * 1, 0,
		0, 100 + vhx * 1, 0,
		100, 100 + vhx * 0.5, 0,
		0, 100 + vhx * 0.5, 0,
		100, 100, 0,
		0, 100, 0,
		100 - Math.cos(Math.PI * 0.1) * 100, 100 - Math.sin(Math.PI * 0.1) * 100, 0,
		100 - Math.cos(Math.PI * 0.1) * 100, 100 - Math.sin(Math.PI * 0.1) * 100, 0,
		100, 100, 0,
		100 - Math.cos(Math.PI * 0.2) * 100, 100 - Math.sin(Math.PI * 0.2) * 100, 0,
		100, 100, 0,
		100 - Math.cos(Math.PI * 0.3) * 100, 100 - Math.sin(Math.PI * 0.3) * 100, 0,
		100, 100, 0,
		100 - Math.cos(Math.PI * 0.4) * 100, 100 - Math.sin(Math.PI * 0.4) * 100, 0,
		100, 100, 0,
		100, 0, 0
	];
	
	
	gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
	
	if (squareVerticesBuffer2)
	{
		gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesBuffer2);
		//gl.freeBuffer();
	}
	
	squareVerticesBuffer2 = gl.createBuffer();
	gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesBuffer2);
	
	var vertices2 = [
		100, 100, 0,
		100, 80, 0,
		100 + 1 * vwx, 100, 0,
		100 + 1 * vwx, 80, 0,
		100 + 2 * vwx, 100, 0,
		100 + 2 * vwx, 80, 0,
		100 + 3 * vwx, 100, 0,
		100 + 3 * vwx, 80, 0,
		100 + 4 * vwx, 100, 0,
		100 + 4 * vwx, 80, 0,
		vw - 100, 100, 0,
		vw - 100, 80, 0,
		vw - 100 + Math.cos(Math.PI * 0.4) * 20, 100 - Math.sin(Math.PI * 0.4) * 20, 0,
		vw - 100 + Math.cos(Math.PI * 0.4) * 20, 100 - Math.sin(Math.PI * 0.4) * 20, 0,
		vw - 100, 100, 0,
		vw - 100 + Math.cos(Math.PI * 0.3) * 20, 100 - Math.sin(Math.PI * 0.3) * 20, 0,
		vw - 100, 100, 0,
		vw - 100 + Math.cos(Math.PI * 0.2) * 20, 100 - Math.sin(Math.PI * 0.2) * 20, 0,
		vw - 100, 100, 0,
		vw - 100 + Math.cos(Math.PI * 0.1) * 20, 100 - Math.sin(Math.PI * 0.1) * 20, 0,
		vw - 100, 100, 0,
		vw - 80, 100, 0,
		vw - 100, 100 + 1 * vhx, 0,
		vw - 80, 100 + 1 * vhx, 0,
		vw - 100, 100 + 2 * vhx, 0,
		vw - 80, 100 + 2 * vhx, 0,
		vw - 100, 100 + 3 * vhx, 0,
		vw - 80, 100 + 3 * vhx, 0,
		vw - 100, vh - 100, 0,
		vw - 80, vh - 100, 0,
		vw - 100 + Math.cos(Math.PI * 0.1) * 20, vh - 100 + Math.sin(Math.PI * 0.1) * 20, 0,
		vw - 100 + Math.cos(Math.PI * 0.1) * 20, vh - 100 + Math.sin(Math.PI * 0.1) * 20, 0,
		vw - 100, vh - 100, 0,
		vw - 100 + Math.cos(Math.PI * 0.2) * 20, vh - 100 + Math.sin(Math.PI * 0.2) * 20, 0,
		vw - 100, vh - 100, 0,
		vw - 100 + Math.cos(Math.PI * 0.3) * 20, vh - 100 + Math.sin(Math.PI * 0.3) * 20, 0,
		vw - 100, vh - 100, 0,
		vw - 100 + Math.cos(Math.PI * 0.4) * 20, vh - 100 + Math.sin(Math.PI * 0.4) * 20, 0,
		vw - 100, vh - 100, 0,
		vw - 100, vh - 80, 0,
		100 + 4 * vwx, vh - 100, 0,
		100 + 4 * vwx, vh - 80, 0,
		100 + 3 * vwx, vh - 100, 0,
		100 + 3 * vwx, vh - 80, 0,
		100 + 2 * vwx, vh - 100, 0,
		100 + 2 * vwx, vh - 80, 0,
		100 + 1 * vwx, vh - 100, 0,
		100 + 1 * vwx, vh - 80, 0,
		100, vh - 100, 0,
		100, vh - 80, 0,
		100 - Math.cos(Math.PI * 0.4) * 20, vh - 100 + Math.sin(Math.PI * 0.4) * 20, 0,
		100 - Math.cos(Math.PI * 0.4) * 20, vh - 100 + Math.sin(Math.PI * 0.4) * 20, 0,
		100, vh - 100, 0,
		100 - Math.cos(Math.PI * 0.3) * 20, vh - 100 + Math.sin(Math.PI * 0.3) * 20, 0,
		100, vh - 100, 0,
		100 - Math.cos(Math.PI * 0.2) * 20, vh - 100 + Math.sin(Math.PI * 0.2) * 20, 0,
		100, vh - 100, 0,
		100 - Math.cos(Math.PI * 0.1) * 20, vh - 100 + Math.sin(Math.PI * 0.1) * 20, 0,
		100, vh - 100, 0,
		80, vh - 100, 0,
		100, 100 + vhx * 3, 0,
		80, 100 + vhx * 3, 0,
		100, 100 + vhx * 2, 0,
		80, 100 + vhx * 2, 0,
		100, 100 + vhx * 1, 0,
		80, 100 + vhx * 1, 0,
		100, 100, 0,
		80, 100, 0,
		100 - Math.cos(Math.PI * 0.1) * 20, 100 - Math.sin(Math.PI * 0.1) * 20, 0,
		100 - Math.cos(Math.PI * 0.1) * 20, 100 - Math.sin(Math.PI * 0.1) * 20, 0,
		100, 100, 0,
		100 - Math.cos(Math.PI * 0.2) * 20, 100 - Math.sin(Math.PI * 0.2) * 20, 0,
		100, 100, 0,
		100 - Math.cos(Math.PI * 0.3) * 20, 100 - Math.sin(Math.PI * 0.3) * 20, 0,
		100, 100, 0,
		100 - Math.cos(Math.PI * 0.4) * 20, 100 - Math.sin(Math.PI * 0.4) * 20, 0,
		100, 100, 0,
		100, 80, 0
	];
	
	gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices2), gl.STATIC_DRAW);
	
	var colors = new Array(78 * 4);
	for (var q = 0; q < 78 * 4; q++)
	colors[q] = 1.0;
	
	if (squareVerticesColorBuffer)
	{
		gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesColorBuffer);
		//gl.freeBuffer();
	}	
	squareVerticesColorBuffer = gl.createBuffer();
	gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesColorBuffer);
	gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);
	
	var colors2 = new Array(78 * 4);
	for (var q = 0; q < 78 * 4; q++)
	colors[q] = 1.0;
	
	if (squareVerticesColorBuffer2)
	{
		gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesColorBuffer2);
		//gl.freeBuffer();
	}
	
	squareVerticesColorBuffer2 = gl.createBuffer();
	gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesColorBuffer2);
	gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors2), gl.STATIC_DRAW);
	
	vwc = vw;
	vhc = vh;
}

//
// drawScene
//
// Draw the scene.
//
function drawScene(vw, vh, data) {
	if (vwc != vw || vhc != vh)
		initBuffers(vw, vh);
	

	gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
	gl.clearColor(0.0,0.0,0.0,0.0);	
  
	loadIdentity();
	
	orthoMatrix = makeOrtho(0, vw, vh, 0, 0.1, 10);
  
	mvTranslate([-0.0, 0.0, -2.0]);
  
	function c1(r) { return Math.min(r * 0.9 + 0.1, 1.0); }
	function r2(r) { return Math.max(r * 1.1 - 0.1, 0.0); }
	function g2(r) { return Math.max(r * 1.1 - 0.1, 0.07); }
	function b2(r) { return Math.max(r * 1.1 - 0.1, 0.2); }
  
	var colors = [
		c1(data[0 * 4 + 0]), c1(data[0 * 4 + 1]), c1(data[0 * 4 + 2]), data[0 * 4 + 3],
		r2(data[0 * 4 + 0]), g2(data[0 * 4 + 1]), b2(data[0 * 4 + 2]), 0.0,
		c1(data[1 * 4 + 0] * .5 + data[0 * 4 + 0] * .5), c1(data[1 * 4 + 1] * .5 + data[0 * 4 + 1] * .5), c1(data[1 * 4 + 2] * .5 + data[0 * 4 + 2] * .5), data[1 * 4 + 3] * .5 + data[0 * 4 + 3] * .5,
		r2(data[1 * 4 + 0] * .5 + data[0 * 4 + 0] * .5), g2(data[1 * 4 + 1] * .5 + data[0 * 4 + 1] * .5), b2(data[1 * 4 + 2] * .5 + data[0 * 4 + 2] * .5), 0.0,
		c1(data[1 * 4 + 0]), c1(data[1 * 4 + 1]), c1(data[1 * 4 + 2]), data[1 * 4 + 3],
		r2(data[1 * 4 + 0]), g2(data[1 * 4 + 1]), b2(data[1 * 4 + 2]), 0.0,
		c1(data[2 * 4 + 0] * .5 + data[1 * 4 + 0] * .5), c1(data[2 * 4 + 1] * .5 + data[1 * 4 + 1] * .5), c1(data[2 * 4 + 2] * .5 + data[1 * 4 + 2] * .5), data[2 * 4 + 3] * .5 + data[1 * 4 + 3] * .5,
		r2(data[2 * 4 + 0] * .5 + data[1 * 4 + 0] * .5), g2(data[2 * 4 + 1] * .5 + data[1 * 4 + 1] * .5), b2(data[2 * 4 + 2] * .5 + data[1 * 4 + 2] * .5), 0.0,
		c1(data[2 * 4 + 0]), c1(data[2 * 4 + 1]), c1(data[2 * 4 + 2]), data[2 * 4 + 3],
		r2(data[2 * 4 + 0]), g2(data[2 * 4 + 1]), b2(data[2 * 4 + 2]), 0.0,
		c1(data[3 * 4 + 0] * .5 + data[2 * 4 + 0] * .5), c1(data[3 * 4 + 1] * .5 + data[2 * 4 + 1] * .5), c1(data[3 * 4 + 2] * .5 + data[2 * 4 + 2] * .5), data[3 * 4 + 3] * .5 + data[2 * 4 + 3] * .5,
		r2(data[3 * 4 + 0] * .5 + data[2 * 4 + 0] * .5), g2(data[3 * 4 + 1] * .5 + data[2 * 4 + 1] * .5), b2(data[3 * 4 + 2] * .5 + data[2 * 4 + 2] * .5), 0.0,
		c1(data[3 * 4 + 0]), c1(data[3 * 4 + 1]), c1(data[3 * 4 + 2]), data[3 * 4 + 3],
		r2(data[3 * 4 + 0]), g2(data[3 * 4 + 1]), b2(data[3 * 4 + 2]), 0.0,
		c1(data[4 * 4 + 0] * .5 + data[3 * 4 + 0] * .5), c1(data[4 * 4 + 1] * .5 + data[3 * 4 + 1] * .5), c1(data[4 * 4 + 2] * .5 + data[3 * 4 + 2] * .5), data[4 * 4 + 3] * .5 + data[3 * 4 + 3] * .5,
		r2(data[4 * 4 + 0] * .5 + data[3 * 4 + 0] * .5), g2(data[4 * 4 + 1] * .5 + data[3 * 4 + 1] * .5), b2(data[4 * 4 + 2] * .5 + data[3 * 4 + 2] * .5), 0.0,
		c1(data[4 * 4 + 0]), c1(data[4 * 4 + 1]), c1(data[4 * 4 + 2]), data[4 * 4 + 3],
		r2(data[4 * 4 + 0]), g2(data[4 * 4 + 1]), b2(data[4 * 4 + 2]), 0.0,
		c1(data[5 * 4 + 0] * .5 + data[4 * 4 + 0] * .5), c1(data[5 * 4 + 1] * .5 + data[4 * 4 + 1] * .5), c1(data[5 * 4 + 2] * .5 + data[4 * 4 + 2] * .5), data[5 * 4 + 3] * .5 + data[4 * 4 + 3] * .5,
		r2(data[5 * 4 + 0] * .5 + data[4 * 4 + 0] * .5), g2(data[5 * 4 + 1] * .5 + data[4 * 4 + 1] * .5), b2(data[5 * 4 + 2] * .5 + data[4 * 4 + 2] * .5), 0.0,
		c1(data[5 * 4 + 0]), c1(data[5 * 4 + 1]), c1(data[5 * 4 + 2]), data[5 * 4 + 3],
		r2(data[5 * 4 + 0]), g2(data[5 * 4 + 1]), b2(data[5 * 4 + 2]), 0.0,
		r2(data[5 * 4 + 0]), g2(data[5 * 4 + 1]), b2(data[5 * 4 + 2]), 0.0,
		r2(data[5 * 4 + 0]), g2(data[5 * 4 + 1]), b2(data[5 * 4 + 2]), 0.0,
		c1(data[5 * 4 + 0]), c1(data[5 * 4 + 1]), c1(data[5 * 4 + 2]), data[5 * 4 + 3],
		r2(data[5 * 4 + 0]), g2(data[5 * 4 + 1]), b2(data[5 * 4 + 2]), 0.0,
		c1(data[5 * 4 + 0]), c1(data[5 * 4 + 1]), c1(data[5 * 4 + 2]), data[5 * 4 + 3],
		r2(data[5 * 4 + 0]), g2(data[5 * 4 + 1]), b2(data[5 * 4 + 2]), 0.0,
		c1(data[5 * 4 + 0]), c1(data[5 * 4 + 1]), c1(data[5 * 4 + 2]), data[5 * 4 + 3],
		r2(data[5 * 4 + 0]), g2(data[5 * 4 + 1]), b2(data[5 * 4 + 2]), 0.0,
		c1(data[5 * 4 + 0]), c1(data[5 * 4 + 1]), c1(data[5 * 4 + 2]), data[5 * 4 + 3],
		r2(data[5 * 4 + 0]), g2(data[5 * 4 + 1]), b2(data[5 * 4 + 2]), 0.0,
		c1(data[6 * 4 + 0] * .5 + data[5 * 4 + 0] * .5), c1(data[6 * 4 + 1] * .5 + data[5 * 4 + 1] * .5), c1(data[6 * 4 + 2] * .5 + data[5 * 4 + 2] * .5), data[6 * 4 + 3] * .5 + data[5 * 4 + 3] * .5,
		r2(data[6 * 4 + 0] * .5 + data[5 * 4 + 0] * .5), g2(data[6 * 4 + 1] * .5 + data[5 * 4 + 1] * .5), b2(data[6 * 4 + 2] * .5 + data[5 * 4 + 2] * .5), 0.0,
		c1(data[6 * 4 + 0]), c1(data[6 * 4 + 1]), c1(data[6 * 4 + 2]), data[6 * 4 + 3],
		r2(data[6 * 4 + 0]), g2(data[6 * 4 + 1]), b2(data[6 * 4 + 2]), 0.0,
		c1(data[7 * 4 + 0] * .5 + data[6 * 4 + 0] * .5), c1(data[7 * 4 + 1] * .5 + data[6 * 4 + 1] * .5), c1(data[7 * 4 + 2] * .5 + data[6 * 4 + 2] * .5), data[7 * 4 + 3] * .5 + data[6 * 4 + 3] * .5,
		r2(data[7 * 4 + 0] * .5 + data[6 * 4 + 0] * .5), g2(data[7 * 4 + 1] * .5 + data[6 * 4 + 1] * .5), b2(data[7 * 4 + 2] * .5 + data[6 * 4 + 2] * .5), 0.0,
		c1(data[7 * 4 + 0]), c1(data[7 * 4 + 1]), c1(data[7 * 4 + 2]), data[7 * 4 + 3],
		r2(data[7 * 4 + 0]), g2(data[7 * 4 + 1]), b2(data[7 * 4 + 2]), 0.0,
		c1(data[8 * 4 + 0] * .5 + data[7 * 4 + 0] * .5), c1(data[8 * 4 + 1] * .5 + data[7 * 4 + 1] * .5), c1(data[8 * 4 + 2] * .5 + data[7 * 4 + 2] * .5), data[8 * 4 + 3] * .5 + data[7 * 4 + 3] * .5,
		r2(data[8 * 4 + 0] * .5 + data[7 * 4 + 0] * .5), g2(data[8 * 4 + 1] * .5 + data[7 * 4 + 1] * .5), b2(data[8 * 4 + 2] * .5 + data[7 * 4 + 2] * .5), 0.0,
		c1(data[8 * 4 + 0]), c1(data[8 * 4 + 1]), c1(data[8 * 4 + 2]), data[8 * 4 + 3],
		r2(data[8 * 4 + 0]), g2(data[8 * 4 + 1]), b2(data[8 * 4 + 2]), 0.0,
		c1(data[9 * 4 + 0] * .5 + data[8 * 4 + 0] * .5), c1(data[9 * 4 + 1] * .5 + data[8 * 4 + 1] * .5), c1(data[9 * 4 + 2] * .5 + data[8 * 4 + 2] * .5), data[9 * 4 + 3] * .5 + data[8 * 4 + 3] * .5,
		r2(data[9 * 4 + 0] * .5 + data[8 * 4 + 0] * .5), g2(data[9 * 4 + 1] * .5 + data[8 * 4 + 1] * .5), b2(data[9 * 4 + 2] * .5 + data[8 * 4 + 2] * .5), 0.0,
		c1(data[9 * 4 + 0]), c1(data[9 * 4 + 1]), c1(data[9 * 4 + 2]), data[9 * 4 + 3],
		r2(data[9 * 4 + 0]), g2(data[9 * 4 + 1]), b2(data[9 * 4 + 2]), 0.0,
		r2(data[9 * 4 + 0]), g2(data[9 * 4 + 1]), b2(data[9 * 4 + 2]), 0.0,
		r2(data[9 * 4 + 0]), g2(data[9 * 4 + 1]), b2(data[9 * 4 + 2]), 0.0,
		c1(data[9 * 4 + 0]), c1(data[9 * 4 + 1]), c1(data[9 * 4 + 2]), data[9 * 4 + 3],
		r2(data[9 * 4 + 0]), g2(data[9 * 4 + 1]), b2(data[9 * 4 + 2]), 0.0,
		c1(data[9 * 4 + 0]), c1(data[9 * 4 + 1]), c1(data[9 * 4 + 2]), data[9 * 4 + 3],
		r2(data[9 * 4 + 0]), g2(data[9 * 4 + 1]), b2(data[9 * 4 + 2]), 0.0,
		c1(data[9 * 4 + 0]), c1(data[9 * 4 + 1]), c1(data[9 * 4 + 2]), data[9 * 4 + 3],
		r2(data[9 * 4 + 0]), g2(data[9 * 4 + 1]), b2(data[9 * 4 + 2]), 0.0,
		c1(data[9 * 4 + 0]), c1(data[9 * 4 + 1]), c1(data[9 * 4 + 2]), data[9 * 4 + 3],
		r2(data[9 * 4 + 0]), g2(data[9 * 4 + 1]), b2(data[9 * 4 + 2]), 0.0,
		c1(data[10 * 4 + 0] * .5 + data[9 * 4 + 0] * .5), c1(data[10 * 4 + 1] * .5 + data[9 * 4 + 1] * .5), c1(data[10 * 4 + 2] * .5 + data[9 * 4 + 2] * .5), data[10 * 4 + 3] * .5 + data[9 * 4 + 3] * .5,
		r2(data[10 * 4 + 0] * .5 + data[9 * 4 + 0] * .5), g2(data[10 * 4 + 1] * .5 + data[9 * 4 + 1] * .5), b2(data[10 * 4 + 2] * .5 + data[9 * 4 + 2] * .5), 0.0,
		c1(data[10 * 4 + 0]), c1(data[10 * 4 + 1]), c1(data[10 * 4 + 2]), data[10 * 4 + 3],
		r2(data[10 * 4 + 0]), g2(data[10 * 4 + 1]), b2(data[10 * 4 + 2]), 0.0,
		c1(data[11 * 4 + 0] * .5 + data[10 * 4 + 0] * .5), c1(data[11 * 4 + 1] * .5 + data[10 * 4 + 1] * .5), c1(data[11 * 4 + 2] * .5 + data[10 * 4 + 2] * .5), data[11 * 4 + 3] * .5 + data[10 * 4 + 3] * .5,
		r2(data[11 * 4 + 0] * .5 + data[10 * 4 + 0] * .5), g2(data[11 * 4 + 1] * .5 + data[10 * 4 + 1] * .5), b2(data[11 * 4 + 2] * .5 + data[10 * 4 + 2] * .5), 0.0,
		c1(data[11 * 4 + 0]), c1(data[11 * 4 + 1]), c1(data[11 * 4 + 2]), data[11 * 4 + 3],
		r2(data[11 * 4 + 0]), g2(data[11 * 4 + 1]), b2(data[11 * 4 + 2]), 0.0,
		c1(data[11 * 4 + 0] * .5 + data[12 * 4 + 0] * .5), c1(data[11 * 4 + 1] * .5 + data[12 * 4 + 1] * .5), c1(data[11 * 4 + 2] * .5 + data[12 * 4 + 2] * .5), data[11 * 4 + 3] * .5 + data[12 * 4 + 3] * .5,
		r2(data[11 * 4 + 0] * .5 + data[12 * 4 + 0] * .5), g2(data[11 * 4 + 1] * .5 + data[12 * 4 + 1] * .5), b2(data[11 * 4 + 2] * .5 + data[12 * 4 + 2] * .5), 0.0,
		c1(data[12 * 4 + 0]), c1(data[12 * 4 + 1]), c1(data[12 * 4 + 2]), data[12 * 4 + 3],
		r2(data[12 * 4 + 0]), g2(data[12 * 4 + 1]), b2(data[12 * 4 + 2]), 0.0,
		c1(data[13 * 4 + 0] * .5 + data[12 * 4 + 0] * .5), c1(data[13 * 4 + 1] * .5 + data[12 * 4 + 1] * .5), c1(data[13 * 4 + 2] * .5 + data[12 * 4 + 2] * .5), data[13 * 4 + 3] * .5 + data[12 * 4 + 3] * .5,
		r2(data[13 * 4 + 0] * .5 + data[12 * 4 + 0] * .5), g2(data[13 * 4 + 1] * .5 + data[12 * 4 + 1] * .5), b2(data[13 * 4 + 2] * .5 + data[12 * 4 + 2] * .5), 0.0,
		c1(data[13 * 4 + 0]), c1(data[13 * 4 + 1]), c1(data[13 * 4 + 2]), data[13 * 4 + 3],
		r2(data[13 * 4 + 0]), g2(data[13 * 4 + 1]), b2(data[13 * 4 + 2]), 0.0,
		c1(data[13 * 4 + 0] * .5 + data[14 * 4 + 0] * .5), c1(data[13 * 4 + 1] * .5 + data[14 * 4 + 1] * .5), c1(data[13 * 4 + 2] * .5 + data[14 * 4 + 2] * .5), data[13 * 4 + 3] * .5 + data[14 * 4 + 3] * .5,
		r2(data[13 * 4 + 0] * .5 + data[14 * 4 + 0] * .5), g2(data[13 * 4 + 1] * .5 + data[14 * 4 + 1] * .5), b2(data[13 * 4 + 2] * .5 + data[14 * 4 + 2] * .5), 0.0,
		c1(data[14 * 4 + 0]), c1(data[14 * 4 + 1]), c1(data[14 * 4 + 2]), data[14 * 4 + 3],
		r2(data[14 * 4 + 0]), g2(data[14 * 4 + 1]), b2(data[14 * 4 + 2]), 0.0,
		r2(data[14 * 4 + 0]), g2(data[14 * 4 + 1]), b2(data[14 * 4 + 2]), 0.0,
		r2(data[14 * 4 + 0]), g2(data[14 * 4 + 1]), b2(data[14 * 4 + 2]), 0.0,
		c1(data[14 * 4 + 0]), c1(data[14 * 4 + 1]), c1(data[14 * 4 + 2]), data[14 * 4 + 3],
		r2(data[14 * 4 + 0]), g2(data[14 * 4 + 1]), b2(data[14 * 4 + 2]), 0.0,
		c1(data[14 * 4 + 0]), c1(data[14 * 4 + 1]), c1(data[14 * 4 + 2]), data[14 * 4 + 3],
		r2(data[14 * 4 + 0]), g2(data[14 * 4 + 1]), b2(data[14 * 4 + 2]), 0.0,
		c1(data[14 * 4 + 0]), c1(data[14 * 4 + 1]), c1(data[14 * 4 + 2]), data[14 * 4 + 3],
		r2(data[14 * 4 + 0]), g2(data[14 * 4 + 1]), b2(data[14 * 4 + 2]), 0.0,
		c1(data[14 * 4 + 0]), c1(data[14 * 4 + 1]), c1(data[14 * 4 + 2]), data[14 * 4 + 3],
		r2(data[14 * 4 + 0]), g2(data[14 * 4 + 1]), b2(data[14 * 4 + 2]), 0.0,
		c1(data[15 * 4 + 0] * .5 + data[14 * 4 + 0] * .5), c1(data[15 * 4 + 1] * .5 + data[14 * 4 + 1] * .5), c1(data[15 * 4 + 2] * .5 + data[14 * 4 + 2] * .5), data[15 * 4 + 3] * .5 + data[14 * 4 + 3] * .5,
		r2(data[15 * 4 + 0] * .5 + data[14 * 4 + 0] * .5), g2(data[15 * 4 + 1] * .5 + data[14 * 4 + 1] * .5), b2(data[15 * 4 + 2] * .5 + data[14 * 4 + 2] * .5), 0.0,
		c1(data[15 * 4 + 0]), c1(data[15 * 4 + 1]), c1(data[15 * 4 + 2]), data[15 * 4 + 3],
		r2(data[15 * 4 + 0]), g2(data[15 * 4 + 1]), b2(data[15 * 4 + 2]), 0.0,
		c1(data[15 * 4 + 0] * .5 + data[16 * 4 + 0] * .5), c1(data[15 * 4 + 1] * .5 + data[16 * 4 + 1] * .5), c1(data[15 * 4 + 2] * .5 + data[16 * 4 + 2] * .5), data[15 * 4 + 3] * .5 + data[16 * 4 + 3] * .5,
		r2(data[15 * 4 + 0] * .5 + data[16 * 4 + 0] * .5), g2(data[15 * 4 + 1] * .5 + data[16 * 4 + 1] * .5), b2(data[15 * 4 + 2] * .5 + data[16 * 4 + 2] * .5), 0.0,
		c1(data[16 * 4 + 0]), c1(data[16 * 4 + 1]), c1(data[16 * 4 + 2]), data[16 * 4 + 3],
		r2(data[16 * 4 + 0]), g2(data[16 * 4 + 1]), b2(data[16 * 4 + 2]), 0.0,
		c1(data[17 * 4 + 0] * .5 + data[16 * 4 + 0] * .5), c1(data[17 * 4 + 1] * .5 + data[16 * 4 + 1] * .5), c1(data[17 * 4 + 2] * .5 + data[16 * 4 + 2] * .5), data[17 * 4 + 3] * .5 + data[16 * 4 + 3] * .5,
		r2(data[17 * 4 + 0] * .5 + data[16 * 4 + 0] * .5), g2(data[17 * 4 + 1] * .5 + data[16 * 4 + 1] * .5), b2(data[17 * 4 + 2] * .5 + data[16 * 4 + 2] * .5), 0.0,
		c1(data[17 * 4 + 0]), c1(data[17 * 4 + 1]), c1(data[17 * 4 + 2]), data[17 * 4 + 3],
		r2(data[17 * 4 + 0]), g2(data[17 * 4 + 1]), b2(data[17 * 4 + 2]), 0.0,
		c1(data[17 * 4 + 0] * .5 + data[0 * 4 + 0] * .5), c1(data[17 * 4 + 1] * .5 + data[0 * 4 + 1] * .5), c1(data[17 * 4 + 2] * .5 + data[0 * 4 + 2] * .5), data[17 * 4 + 3] * .5 + data[0 * 4 + 3] * .5,
		r2(data[17 * 4 + 0] * .5 + data[0 * 4 + 0] * .5), g2(data[17 * 4 + 1] * .5 + data[0 * 4 + 1] * .5), b2(data[17 * 4 + 2] * .5 + data[0 * 4 + 2] * .5), 0.0,
		c1(data[0 * 4 + 0]), c1(data[0 * 4 + 1]), c1(data[0 * 4 + 2]), data[0 * 4 + 3],
		r2(data[0 * 4 + 0]), g2(data[0 * 4 + 1]), b2(data[0 * 4 + 2]), 0.0,
		r2(data[0 * 4 + 0]), g2(data[0 * 4 + 1]), b2(data[0 * 4 + 2]), 0.0,
		r2(data[0 * 4 + 0]), g2(data[0 * 4 + 1]), b2(data[0 * 4 + 2]), 0.0,
		c1(data[0 * 4 + 0]), c1(data[0 * 4 + 1]), c1(data[0 * 4 + 2]), data[0 * 4 + 3],
		r2(data[0 * 4 + 0]), g2(data[0 * 4 + 1]), b2(data[0 * 4 + 2]), 0.0,
		c1(data[0 * 4 + 0]), c1(data[0 * 4 + 1]), c1(data[0 * 4 + 2]), data[0 * 4 + 3],
		r2(data[0 * 4 + 0]), g2(data[0 * 4 + 1]), b2(data[0 * 4 + 2]), 0.0,
		c1(data[0 * 4 + 0]), c1(data[0 * 4 + 1]), c1(data[0 * 4 + 2]), data[0 * 4 + 3],
		r2(data[0 * 4 + 0]), g2(data[0 * 4 + 1]), b2(data[0 * 4 + 2]), 0.0,
		c1(data[0 * 4 + 0]), c1(data[0 * 4 + 1]), c1(data[0 * 4 + 2]), data[0 * 4 + 3],
		r2(data[0 * 4 + 0]), g2(data[0 * 4 + 1]), b2(data[0 * 4 + 2]), 0.0
	];
	
	gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesColorBuffer);
	gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);
  
	// Draw the square by binding the array buffer to the square's vertices
	// array, setting attributes, and pushing it to GL.
	
	gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesBuffer);
	gl.vertexAttribPointer(vertexPositionAttribute, 3, gl.FLOAT, false, 0, 0);
	
	gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesColorBuffer);
	gl.vertexAttribPointer(vertexColorAttribute, 4, gl.FLOAT, false, 0, 0);
	
	setMatrixUniforms();
	gl.drawArrays(gl.TRIANGLE_STRIP, 0, 114);
	
	var colors2 = [
		data[0 * 4 + 0], data[0 * 4 + 1], data[0 * 4 + 2], 1.0,
		data[0 * 4 + 0], data[0 * 4 + 1], data[0 * 4 + 2], 1.0,
		data[1 * 4 + 0], data[1 * 4 + 1], data[1 * 4 + 2], 1.0,
		data[1 * 4 + 0], data[1 * 4 + 1], data[1 * 4 + 2], 1.0,
		data[2 * 4 + 0], data[2 * 4 + 1], data[2 * 4 + 2], 1.0,
		data[2 * 4 + 0], data[2 * 4 + 1], data[2 * 4 + 2], 1.0,
		data[3 * 4 + 0], data[3 * 4 + 1], data[3 * 4 + 2], 1.0,
		data[3 * 4 + 0], data[3 * 4 + 1], data[3 * 4 + 2], 1.0,
		data[4 * 4 + 0], data[4 * 4 + 1], data[4 * 4 + 2], 1.0,
		data[4 * 4 + 0], data[4 * 4 + 1], data[4 * 4 + 2], 1.0,
		data[5 * 4 + 0], data[5 * 4 + 1], data[5 * 4 + 2], 1.0,
		data[5 * 4 + 0], data[5 * 4 + 1], data[5 * 4 + 2], 1.0,
		data[5 * 4 + 0], data[5 * 4 + 1], data[5 * 4 + 2], 1.0,
		data[5 * 4 + 0], data[5 * 4 + 1], data[5 * 4 + 2], 1.0,
		data[5 * 4 + 0], data[5 * 4 + 1], data[5 * 4 + 2], 1.0,
		data[5 * 4 + 0], data[5 * 4 + 1], data[5 * 4 + 2], 1.0,
		data[5 * 4 + 0], data[5 * 4 + 1], data[5 * 4 + 2], 1.0,
		data[5 * 4 + 0], data[5 * 4 + 1], data[5 * 4 + 2], 1.0,
		data[5 * 4 + 0], data[5 * 4 + 1], data[5 * 4 + 2], 1.0,
		data[5 * 4 + 0], data[5 * 4 + 1], data[5 * 4 + 2], 1.0,
		data[5 * 4 + 0], data[5 * 4 + 1], data[5 * 4 + 2], 1.0,
		data[5 * 4 + 0], data[5 * 4 + 1], data[5 * 4 + 2], 1.0,
		data[6 * 4 + 0], data[6 * 4 + 1], data[6 * 4 + 2], 1.0,
		data[6 * 4 + 0], data[6 * 4 + 1], data[6 * 4 + 2], 1.0,
		data[7 * 4 + 0], data[7 * 4 + 1], data[7 * 4 + 2], 1.0,
		data[7 * 4 + 0], data[7 * 4 + 1], data[7 * 4 + 2], 1.0,
		data[8 * 4 + 0], data[8 * 4 + 1], data[8 * 4 + 2], 1.0,
		data[8 * 4 + 0], data[8 * 4 + 1], data[8 * 4 + 2], 1.0,
		data[9 * 4 + 0], data[9 * 4 + 1], data[9 * 4 + 2], 1.0,
		data[9 * 4 + 0], data[9 * 4 + 1], data[9 * 4 + 2], 1.0,
		data[9 * 4 + 0], data[9 * 4 + 1], data[9 * 4 + 2], 1.0,
		data[9 * 4 + 0], data[9 * 4 + 1], data[9 * 4 + 2], 1.0,
		data[9 * 4 + 0], data[9 * 4 + 1], data[9 * 4 + 2], 1.0,
		data[9 * 4 + 0], data[9 * 4 + 1], data[9 * 4 + 2], 1.0,
		data[9 * 4 + 0], data[9 * 4 + 1], data[9 * 4 + 2], 1.0,
		data[9 * 4 + 0], data[9 * 4 + 1], data[9 * 4 + 2], 1.0,
		data[9 * 4 + 0], data[9 * 4 + 1], data[9 * 4 + 2], 1.0,
		data[9 * 4 + 0], data[9 * 4 + 1], data[9 * 4 + 2], 1.0,
		data[9 * 4 + 0], data[9 * 4 + 1], data[9 * 4 + 2], 1.0,
		data[9 * 4 + 0], data[9 * 4 + 1], data[9 * 4 + 2], 1.0,
		data[10 * 4 + 0], data[10 * 4 + 1], data[10 * 4 + 2], 1.0,
		data[10 * 4 + 0], data[10 * 4 + 1], data[10 * 4 + 2], 1.0,
		data[11 * 4 + 0], data[11 * 4 + 1], data[11 * 4 + 2], 1.0,
		data[11 * 4 + 0], data[11 * 4 + 1], data[11 * 4 + 2], 1.0,
		data[12 * 4 + 0], data[12 * 4 + 1], data[12 * 4 + 2], 1.0,
		data[12 * 4 + 0], data[12 * 4 + 1], data[12 * 4 + 2], 1.0,
		data[13 * 4 + 0], data[13 * 4 + 1], data[13 * 4 + 2], 1.0,
		data[13 * 4 + 0], data[13 * 4 + 1], data[13 * 4 + 2], 1.0,
		data[14 * 4 + 0], data[14 * 4 + 1], data[14 * 4 + 2], 1.0,
		data[14 * 4 + 0], data[14 * 4 + 1], data[14 * 4 + 2], 1.0,
		data[14 * 4 + 0], data[14 * 4 + 1], data[14 * 4 + 2], 1.0,
		data[14 * 4 + 0], data[14 * 4 + 1], data[14 * 4 + 2], 1.0,
		data[14 * 4 + 0], data[14 * 4 + 1], data[14 * 4 + 2], 1.0,
		data[14 * 4 + 0], data[14 * 4 + 1], data[14 * 4 + 2], 1.0,
		data[14 * 4 + 0], data[14 * 4 + 1], data[14 * 4 + 2], 1.0,
		data[14 * 4 + 0], data[14 * 4 + 1], data[14 * 4 + 2], 1.0,
		data[14 * 4 + 0], data[14 * 4 + 1], data[14 * 4 + 2], 1.0,
		data[14 * 4 + 0], data[14 * 4 + 1], data[14 * 4 + 2], 1.0,
		data[14 * 4 + 0], data[14 * 4 + 1], data[14 * 4 + 2], 1.0,
		data[14 * 4 + 0], data[14 * 4 + 1], data[14 * 4 + 2], 1.0,
		data[15 * 4 + 0], data[15 * 4 + 1], data[15 * 4 + 2], 1.0,
		data[15 * 4 + 0], data[15 * 4 + 1], data[15 * 4 + 2], 1.0,
		data[16 * 4 + 0], data[16 * 4 + 1], data[16 * 4 + 2], 1.0,
		data[16 * 4 + 0], data[16 * 4 + 1], data[16 * 4 + 2], 1.0,
		data[17 * 4 + 0], data[17 * 4 + 1], data[17 * 4 + 2], 1.0,
		data[17 * 4 + 0], data[17 * 4 + 1], data[17 * 4 + 2], 1.0,
		data[0 * 4 + 0], data[0 * 4 + 1], data[0 * 4 + 2], 1.0,
		data[0 * 4 + 0], data[0 * 4 + 1], data[0 * 4 + 2], 1.0,
		data[0 * 4 + 0], data[0 * 4 + 1], data[0 * 4 + 2], 1.0,
		data[0 * 4 + 0], data[0 * 4 + 1], data[0 * 4 + 2], 1.0,
		data[0 * 4 + 0], data[0 * 4 + 1], data[0 * 4 + 2], 1.0,
		data[0 * 4 + 0], data[0 * 4 + 1], data[0 * 4 + 2], 1.0,
		data[0 * 4 + 0], data[0 * 4 + 1], data[0 * 4 + 2], 1.0,
		data[0 * 4 + 0], data[0 * 4 + 1], data[0 * 4 + 2], 1.0,
		data[0 * 4 + 0], data[0 * 4 + 1], data[0 * 4 + 2], 1.0,
		data[0 * 4 + 0], data[0 * 4 + 1], data[0 * 4 + 2], 1.0,
		data[0 * 4 + 0], data[0 * 4 + 1], data[0 * 4 + 2], 1.0,
		data[0 * 4 + 0], data[0 * 4 + 1], data[0 * 4 + 2], 1.0
	];
	
	gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesColorBuffer2);
	gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors2), gl.STATIC_DRAW);
	
	gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesBuffer2);
	gl.vertexAttribPointer(vertexPositionAttribute, 3, gl.FLOAT, false, 0, 0);
	
	gl.bindBuffer(gl.ARRAY_BUFFER, squareVerticesColorBuffer2);
	gl.vertexAttribPointer(vertexColorAttribute, 4, gl.FLOAT, false, 0, 0);
	
	//setMatrixUniforms();
	gl.drawArrays(gl.TRIANGLE_STRIP, 0, 78);
}

function initShaders() {
	var fragmentShader = getShader(gl, "shader-fs");
	var vertexShader = getShader(gl, "shader-vs");
	
	shaderProgram = gl.createProgram();
	gl.attachShader(shaderProgram, vertexShader);
	gl.attachShader(shaderProgram, fragmentShader);
	gl.linkProgram(shaderProgram);
	
	if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
	  alert("Unable to initialize the shader program.");
	}
	
	gl.useProgram(shaderProgram);
	
	vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");
	gl.enableVertexAttribArray(vertexPositionAttribute);
	
	vertexColorAttribute = gl.getAttribLocation(shaderProgram, "aVertexColor");
	gl.enableVertexAttribArray(vertexColorAttribute);
}

function getShader(gl, id) {
	var shaderScript = document.getElementById(id);
  
	
	if (!shaderScript) {
		return null;
	}
	
	var theSource = "";
	var currentChild = shaderScript.firstChild;
	
	while(currentChild) {
		if (currentChild.nodeType == 3) {
		  theSource += currentChild.textContent;
		}
		
		currentChild = currentChild.nextSibling;
	}
	
	var shader;
	
	if (shaderScript.type == "x-shader/x-fragment") {
		shader = gl.createShader(gl.FRAGMENT_SHADER);
	} else if (shaderScript.type == "x-shader/x-vertex") {
		shader = gl.createShader(gl.VERTEX_SHADER);
	} else {
		return null;  // Unknown shader type
	}
	
	gl.shaderSource(shader, theSource);
	gl.compileShader(shader);
	
	if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
		alert("An error occurred compiling the shaders: " + gl.getShaderInfoLog(shader));
		return null;
	}
	
	return shader;
}

function loadIdentity() {
	mvMatrix = Matrix.I(4);
}

function multMatrix(m) {
	mvMatrix = mvMatrix.x(m);
}

function mvTranslate(v) {
	multMatrix(Matrix.Translation($V([v[0], v[1], v[2]])).ensure4x4());
}

function setMatrixUniforms() {
	var pUniform = gl.getUniformLocation(shaderProgram, "uPMatrix");
	gl.uniformMatrix4fv(pUniform, false, new Float32Array(orthoMatrix.flatten()));
  
	var mvUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");
	gl.uniformMatrix4fv(mvUniform, false, new Float32Array(mvMatrix.flatten()));
}
