michael@0: WebGLUtil = (function() { michael@0: // --------------------------------------------------------------------------- michael@0: // Error handling (for obvious failures, such as invalid element ids) michael@0: michael@0: function defaultErrorFunc(str) { michael@0: console.log('Error: ' + str); michael@0: } michael@0: michael@0: var gErrorFunc = defaultErrorFunc; michael@0: function setErrorFunc(func) { michael@0: gErrorFunc = func; michael@0: } michael@0: michael@0: function error(str) { michael@0: gErrorFunc(str); michael@0: } michael@0: michael@0: // --------------------------------------------------------------------------- michael@0: // Warning handling (for failures that may be intentional) michael@0: michael@0: function defaultWarningFunc(str) { michael@0: console.log('Warning: ' + str); michael@0: } michael@0: michael@0: var gWarningFunc = defaultWarningFunc; michael@0: function setWarningFunc(func) { michael@0: gWarningFunc = func; michael@0: } michael@0: michael@0: function warning(str) { michael@0: gWarningFunc(str); michael@0: } michael@0: michael@0: // --------------------------------------------------------------------------- michael@0: // WebGL helpers michael@0: michael@0: function getWebGL(canvasId, requireConformant) { michael@0: // `requireConformant` will default to falsey if it is not supplied. michael@0: michael@0: var canvas = document.getElementById(canvasId); michael@0: michael@0: var gl = null; michael@0: try { michael@0: gl = canvas.getContext('webgl'); michael@0: } catch(e) {} michael@0: michael@0: if (!gl && !requireConformant) { michael@0: try { michael@0: gl = canvas.getContext('experimental-webgl'); michael@0: } catch(e) {} michael@0: } michael@0: michael@0: if (!gl) { michael@0: error('WebGL context could not be retrieved from \'' + canvasId + '\'.'); michael@0: return null; michael@0: } michael@0: michael@0: return gl; michael@0: } michael@0: michael@0: function getContentFromElem(elem) { michael@0: var str = ""; michael@0: var k = elem.firstChild; michael@0: while (k) { michael@0: if (k.nodeType == 3) michael@0: str += k.textContent; michael@0: michael@0: k = k.nextSibling; michael@0: } michael@0: michael@0: return str; michael@0: } michael@0: michael@0: // Returns a valid shader, or null on errors. michael@0: function createShaderById(gl, id) { michael@0: var elem = document.getElementById(id); michael@0: if (!elem) { michael@0: error('Failed to create shader from non-existent id \'' + id + '\'.'); michael@0: return null; michael@0: } michael@0: michael@0: var src = getContentFromElem(elem); michael@0: michael@0: var shader; michael@0: if (elem.type == "x-shader/x-fragment") { michael@0: shader = gl.createShader(gl.FRAGMENT_SHADER); michael@0: } else if (elem.type == "x-shader/x-vertex") { michael@0: shader = gl.createShader(gl.VERTEX_SHADER); michael@0: } else { michael@0: error('Bad MIME type for shader \'' + id + '\': ' + elem.type + '.'); michael@0: return null; michael@0: } michael@0: michael@0: gl.shaderSource(shader, src); michael@0: gl.compileShader(shader); michael@0: michael@0: return shader; michael@0: } michael@0: michael@0: function createProgramByIds(gl, vsId, fsId) { michael@0: var vs = createShaderById(gl, vsId); michael@0: var fs = createShaderById(gl, fsId); michael@0: if (!vs || !fs) michael@0: return null; michael@0: michael@0: var prog = gl.createProgram(); michael@0: gl.attachShader(prog, vs); michael@0: gl.attachShader(prog, fs); michael@0: gl.linkProgram(prog); michael@0: michael@0: if (!gl.getProgramParameter(prog, gl.LINK_STATUS)) { michael@0: var str = "Shader program linking failed:"; michael@0: str += "\nShader program info log:\n" + gl.getProgramInfoLog(prog); michael@0: str += "\n\nVert shader log:\n" + gl.getShaderInfoLog(vs); michael@0: str += "\n\nFrag shader log:\n" + gl.getShaderInfoLog(fs); michael@0: warning(str); michael@0: return null; michael@0: } michael@0: michael@0: return prog; michael@0: } michael@0: michael@0: return { michael@0: setErrorFunc: setErrorFunc, michael@0: setWarningFunc: setWarningFunc, michael@0: michael@0: getWebGL: getWebGL, michael@0: createShaderById: createShaderById, michael@0: createProgramByIds: createProgramByIds, michael@0: }; michael@0: })();