sawine@0: function main() sawine@0: { sawine@0: var canvas = document.getElementById("machine"); sawine@0: var context = new Context(canvas); sawine@0: var gl = context.gl; sawine@0: var object = new Box(1, context); sawine@0: context.object = object sawine@0: gl.clearColor(0.0, 0.0, 0.0, 1.0); sawine@0: gl.enable(gl.DEPTH_TEST); sawine@0: draw(context); sawine@0: } sawine@0: sawine@0: function Context(canvas) sawine@0: { sawine@0: try sawine@0: { sawine@0: this.gl = canvas.getContext("experimental-webgl"); sawine@0: this.viewport = {'width': canvas.width, sawine@0: 'height': canvas.height}; sawine@0: } sawine@0: catch(e) sawine@0: { sawine@0: alert(e); sawine@0: } sawine@0: if (!this.gl) alert("Failed: WebGL init."); sawine@0: this.mvMatrix = mat4.create(); sawine@0: this.pMatrix = mat4.create(); sawine@0: this.shader = new Shader(this); sawine@0: } sawine@0: Context.prototype.updateMatrixUniforms = function() sawine@0: { sawine@0: var gl = this.gl; sawine@0: var program = this.shader; sawine@0: var pMatrix = this.pMatrix; sawine@0: var mvMatrix = this.mvMatrix; sawine@0: gl.uniformMatrix4fv(program.pMatrixUniform, false, pMatrix); sawine@0: gl.uniformMatrix4fv(program.mvMatrixUniform, false, mvMatrix); sawine@0: } sawine@0: sawine@0: function Shader(context) sawine@0: { sawine@0: var gl = context.gl; sawine@0: var fragment = loadShader(gl, "shader-fs"); sawine@0: var vertex = loadShader(gl, "shader-vs"); sawine@0: this.program = gl.createProgram(); sawine@0: gl.attachShader(this.program, vertex); sawine@0: gl.attachShader(this.program, fragment); sawine@0: gl.linkProgram(this.program); sawine@0: sawine@0: if (!gl.getProgramParameter(this.program, gl.LINK_STATUS)) sawine@0: { sawine@0: alert("Failed: Shader init."); sawine@0: } sawine@0: sawine@0: gl.useProgram(this.program); sawine@0: this.vertexPosition = gl.getAttribLocation(this.program, "aVertexPosition"); sawine@0: gl.enableVertexAttribArray(this.vertexPosition); sawine@0: this.pMatrixUniform = gl.getUniformLocation(this.program, "uPMatrix"); sawine@0: this.mvMatrixUniform = gl.getUniformLocation(this.program, "uMVMatrix"); sawine@0: sawine@0: function loadShader(gl, id) sawine@0: { sawine@0: var script = document.getElementById(id); sawine@0: if (!script) return null; sawine@0: sawine@0: var str = ""; sawine@0: var child = script.firstChild; sawine@0: while (child) sawine@0: { sawine@0: if (child.nodeType == 3) str += child.textContent; sawine@0: child = child.nextSibling; sawine@0: } sawine@0: sawine@0: var shader; sawine@0: var common = "x-shader/x-"; sawine@0: if (script.type == common + "fragment") shader = gl.createShader(gl.FRAGMENT_SHADER); sawine@0: else if (script.type == common + "vertex") shader = gl.createShader(gl.VERTEX_SHADER); sawine@0: else return null; sawine@0: sawine@0: gl.shaderSource(shader, str); sawine@0: gl.compileShader(shader); sawine@0: sawine@0: if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) sawine@0: { sawine@0: alert(gl.getShaderInfoLog(shader)); sawine@0: return null; sawine@0: } sawine@0: sawine@0: return shader; sawine@0: } sawine@0: } sawine@0: sawine@0: sawine@0: function Box(size, context) sawine@0: { sawine@0: var gl = context.gl; sawine@0: this.size = size || 1; sawine@0: this.buffer = gl.createBuffer(); sawine@0: gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer); sawine@0: var vertices = [1.0, 1.0, 0.0, sawine@0: -1.0, 1.0, 0.0, sawine@0: 1.0, -1.0, 0.0, sawine@0: -1.0, -1.0, 0.0]; sawine@0: gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW); sawine@0: this.itemSize = 3; sawine@0: this.numItems = 4; sawine@0: } sawine@0: sawine@0: function draw(context) sawine@0: { sawine@0: var gl = context.gl; sawine@0: var viewport = context.viewport; sawine@0: var shader = context.shader; sawine@0: var mvMatrix = context.mvMatrix; sawine@0: var pMatrix = context.pMatrix; sawine@0: var object = context.object; sawine@0: gl.viewport(0, 0, viewport.width, viewport.height); sawine@0: gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); sawine@0: mat4.perspective(45, viewport.width / viewport.height, 0.1, 100.0, pMatrix); sawine@0: mat4.identity(mvMatrix); sawine@0: mat4.translate(mvMatrix, [0.0, 0.0, -7.0]); sawine@0: gl.bindBuffer(gl.ARRAY_BUFFER, object.buffer); sawine@0: gl.vertexAttribPointer(shader.vertexPosition, object.itemSize, gl.FLOAT, false, 0, 0); sawine@0: context.updateMatrixUniforms(); sawine@0: //gl.uniformMatrix4fv(shader.pMatrixUniform, false, pMatrix); sawine@0: //gl.uniformMatrix4fv(shader.mvMatrixUniform, false, mvMatrix); sawine@0: gl.drawArrays(gl.TRIANGLE_STRIP, 0, object.numItems); sawine@0: return context; sawine@0: }