JSFiddle - React, Tailwind, and code Playground

HTML

<script src="https://www.dropbox.com/s/m6ydli04zmndnk7/sylvester.js?dl=1"></script>
<script src="https://www.dropbox.com/s/p5396sbgfrs3js8/glUtils.js?dl=1"></script>
<script src="sylvester.js" type="text/javascript"></script>
<script src="glUtils.js" type="text/javascript"></script>

<script id="shader-fs" type="x-shader/x-fragment">
varying highp vec2 vTextureCoord;

uniform sampler2D uSampler;

void main(void)
{
    gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t));
}
</script>

<script id="shader-vs" type="x-shader/x-vertex">
attribute vec3 aVertexPosition;
attribute vec2 aTextureCoord;

uniform mat4 uMVMatrix;
uniform mat4 uPMatrix;

varying highp vec2 vTextureCoord;

void main(void)
{
    gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
    vTextureCoord = aTextureCoord;
}
</script>

<body onload="start()">
<canvas id="glCanvas" width="500" height="500">
</canvas>
</body>
</html>

JavaScript

var gl;
var squareVerticesBuffer;
var squareVerticesColorBuffer;
var coinVerticesIndexBuffer;
var mvMatrix;
var shaderProgram;
var vertexPositionAttribute;
var perspectiveMatrix;

var N_vertices = 0;
var N_indices = 0;

var coinImage;
var coinTexture;
var coinVerticesTextureCoordBuffer;
var textureCoordAttribute;

var rotation = 0.0;
var lastSquareUpdateTime = 0;

function initWebGL(canvas)
{
    gl = null;
    gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
    return gl;
}

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.getProgramInfoLog(shaderProgram));
    }
    gl.useProgram(shaderProgram);
    
    vertexPositionAttribute = gl.getAttribLocation(shaderProgram, 'aVertexPosition');
    gl.enableVertexAttribArray(vertexPositionAttribute);
        
    textureCoordAttribute = gl.getAttribLocation(shaderProgram, 'aTextureCoord');
    gl.enableVertexAttribArray(textureCoordAttribute);
}

function getShader(gl, id, type)
{
    var shaderScript, theSource, currentChild, shader;
    
    shaderScript = document.getElementById(id);
    
    if(!shaderScript) return null;
    
    theSource = shaderScript.text;
    
    if(!type)
    {
        if(shaderScript.type == 'x-shader/x-fragment')
        {
            type = gl.FRAGMENT_SHADER;
        }
        else if(shaderScript.type == 'x-shader/x-vertex')
        {
            type = gl.VERTEX_SHADER;
        }
        else
        {
            return null;
        }
    }
    shader = gl.createShader(type);
    
    gl.shaderSource(shader, theSource);
    gl.compileShader(shader);
    //TODO: check for...