function loadShader(pGl, pShaderType, pShaderSource) { const lShader = pGl.createShader(pShaderType); pGl.shaderSource(lShader, pShaderSource); pGl.compileShader(lShader); if (!pGl.getShaderParameter(lShader, pGl.COMPILE_STATUS)) { alert('An error occurred compiling the shaders: ' + pGl.getShaderInfoLog(lShader)); pGl.deleteShader(lShader); return null; } return lShader; } function loadOrthographicShader(pGl) { var lVertex, lFragment; function lLoadShaders() { const lVertexShader = loadShader(pGl, pGl.VERTEX_SHADER, lVertex); const lFragmentShader = loadShader(pGl, pGl.FRAGMENT_SHADER, lFragment); const lShaderProgram = pGl.createProgram(); pGl.attachShader(lShaderProgram, lVertexShader); pGl.attachShader(lShaderProgram, lFragmentShader); pGl.linkProgram(lShaderProgram); if (!pGl.getProgramParameter(lShaderProgram, pGl.LINK_STATUS)) { alert('Unable to initialize the shader program: ' + pGl.getProgramInfoLog(lShaderProgram)); return null; } return { program: lShaderProgram, attributeLocations: { position: pGl.getAttribLocation(lShaderProgram, 'position'), color: pGl.getAttribLocation(lShaderProgram, 'color') }, uniformLocations: { projection: pGl.getUniformLocation(lShaderProgram, 'projection'), model: pGl.getUniformLocation(lShaderProgram, 'model') } } } return fetch('/_rigidbody/shaders/orthographic.vert').then(function(pResponse) { if (pResponse.status === 200) { return pResponse.text().then(function(pShader) { lVertex = pShader; return fetch('/_rigidbody/shaders/orthographic.frag').then(function(pResponse) { if (pResponse.status === 200) { return pResponse.text().then(function(pShader) { lFragment = pShader; return lLoadShaders(); }); } }); }); } }); }