JSFiddle - React, Tailwind, and code Playground

HTML

<canvas id="canvas" width="400" height="400" ></canvas>

JavaScript

function pre(){
	for(obj in arguments)
  		console.log(arguments[obj]);
}
function createShader(str, type) {
	var shader = gl.createShader(type);
	gl.shaderSource(shader, str);
	gl.compileShader(shader);
	if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
		throw gl.getShaderInfoLog(shader);
	}
	return shader;
}
function createProgram(vstr, fstr) {
	var program = gl.createProgram();
	var vshader = createShader(vstr, gl.VERTEX_SHADER);
	var fshader = createShader(fstr, gl.FRAGMENT_SHADER);
	gl.attachShader(program, vshader);
	gl.attachShader(program, fshader);
	gl.linkProgram(program);
	if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
		throw gl.getProgramInfoLog(program);
	}
	return program;
}

function de2ra(deg){
	return deg*Math.PI/180;
}
/**
 * TODO mult, translate....
 */
var Matrix4= function(m){
	this.M=m||new Float32Array(16);

	this.set=function(x,val){
		this.M[x]=val;
	};
	this.get=function(x){
		return this.M[x];
	};

	this.mult=function(b){
		var a=this.M;
		this.M=[		
		a[0]*b.M[0]+a[1]*b.M[4]+a[2]*b.M[8]+a[3]*b.M[12],
		a[0]*b.M[1]+a[1]*b.M[5]+a[2]*b.M[9]+a[3]*b.M[13],
		a[0]*b.M[2]+a[1]*b.M[6]+a[2]*b.M[10]+a[3]*b.M[14],
		a[0]*b.M[3]+a[1]*b.M[7]+a[2]*b.M[11]+a[3]*b.M[15],

		a[4]*b.M[0]+a[5]*b.M[4]+a[6]*b.M[8]+a[7]*b.M[12],
		a[4]*b.M[1]+a[5]*b.M[5]+a[6]*b.M[9]+a[7]*b.M[13],
		a[4]*b.M[2]+a[5]*b.M[6]+a[6]*b.M[10]+a[7]*b.M[14],
		a[4]*b.M[3]+a[5]*b.M[7]+a[6]*b.M[11]+a[7]*b.M[15],

		a[8]*b.M[0]+a[9]*b.M[4]+a[10]*b.M[8]+a[11]*b.M[12],
		a[8]*b.M[1]+a[9]*b.M[5]+a[10]*b.M[9]+a[11]*b.M[13],
		a[8]*b.M[2]+a[9]*b.M[6]+a[10]*b.M[10]+a[11]*b.M[14],
		a[8]*b.M[3]+a[9]*b.M[7]+a[10]*b.M[11]+a[11]*b.M[15],

		a[12]*b.M[0]+a[13]*b.M[4]+a[14]*b.M[8]+a[15]*b.M[12],
		a[12]*b.M[1]+a[13]*b.M[5]+a[14]*b.M[9]+a[15]*b.M[13],
		a[12]*b.M[2]+a[13]*b.M[6]+a[14]*b.M[10]+a[15]*b.M[14],
		a[12]*b.M[3]+a[13]*b.M[7]+a[14]*b.M[11]+a[15]*b.M[15]
		];
		return this;
	};
};
Matrix4.identity=function(){
	this.M=new...