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