machine.js
author Eugen Sawin <sawine@me73.com>
Fri, 06 Jan 2012 01:23:40 +0100
changeset 84 b7834ce141c4
permissions -rw-r--r--
Added ME73 cells.
     1 function main()
     2 {
     3     var canvas = document.getElementById("machine");
     4     var context = new Context(canvas);
     5     var gl = context.gl;
     6     context.object = new Box(1, context);
     7     gl.clearColor(0.0, 0.0, 0.0, 1.0);
     8     gl.enable(gl.DEPTH_TEST);
     9     draw(context);
    10 }
    11 
    12 function Context(canvas)
    13 {
    14     try 
    15     {
    16 	this.gl = canvas.getContext("experimental-webgl");
    17 	this.viewport = {'width': canvas.width,
    18 			 'height': canvas.height};
    19     } 
    20     catch(e) 
    21     {
    22 	alert(e);
    23     }
    24     if (!this.gl) alert("Failed: WebGL init.");
    25     this.mvMatrix = mat4.create();
    26     this.pMatrix = mat4.create();
    27     this.shader = new Shader(this);    
    28 }
    29 Context.prototype.updateMatrixUniforms = function()
    30 {
    31     var gl = this.gl;
    32     var program = this.shader.program;
    33     var pMatrix = this.pMatrix;
    34     var mvMatrix = this.mvMatrix;
    35     gl.uniformMatrix4fv(program.pMatrixUniform, false, pMatrix);
    36     gl.uniformMatrix4fv(program.mvMatrixUniform, false, mvMatrix);
    37 }
    38 
    39 function Shader(context)
    40 {
    41     var gl = context.gl;
    42     var fragment = loadShader(gl, "shader-fs");
    43     var vertex = loadShader(gl, "shader-vs");
    44     this.program = gl.createProgram();
    45     gl.attachShader(this.program, vertex);
    46     gl.attachShader(this.program, fragment);
    47     gl.linkProgram(this.program);
    48 
    49     if (!gl.getProgramParameter(this.program, gl.LINK_STATUS))
    50     {
    51 	alert("Failed: Shader init.");
    52     }
    53 
    54     gl.useProgram(this.program);
    55     this.vertexPosition = gl.getAttribLocation(this.program, "aVertexPosition");
    56     gl.enableVertexAttribArray(this.vertexPosition);
    57     this.pMatrixUniform = gl.getUniformLocation(this.program, "uPMatrix");
    58     this.mvMatrixUniform = gl.getUniformLocation(this.program, "uMVMatrix");
    59 
    60     function loadShader(gl, id)
    61     {
    62 	var script = document.getElementById(id);
    63 	if (!script) return null;
    64 	
    65 	var str = "";
    66 	var child = script.firstChild;
    67 	while (child)
    68 	{
    69 	    if (child.nodeType == 3) str += child.textContent;
    70 	    child = child.nextSibling;
    71 	}
    72 	
    73 	var shader;
    74 	var common = "x-shader/x-";
    75 	if (script.type == common + "fragment") shader = gl.createShader(gl.FRAGMENT_SHADER);
    76 	else if (script.type == common + "vertex") shader = gl.createShader(gl.VERTEX_SHADER);
    77 	else return null;
    78 
    79 	gl.shaderSource(shader, str);
    80 	gl.compileShader(shader);
    81 
    82 	if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS))
    83         {
    84 	    alert(gl.getShaderInfoLog(shader));
    85 	    return null;
    86 	}
    87 
    88 	return shader;
    89     }
    90 }
    91 
    92 
    93 function Box(size, context)
    94 {
    95     var gl = context.gl;
    96     this.size = size || 1;
    97     this.buffer = gl.createBuffer();
    98     gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);
    99     var vertices = [1.0, 1.0, 0.0,
   100 		    -1.0, 1.0, 0.0,
   101 		    1.0, -1.0, 0.0,
   102 		    -1.0, -1.0, 0.0];
   103     gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
   104     this.itemSize = 3;
   105     this.numItems = 4;
   106 }
   107 
   108 function draw(context)
   109 {
   110     var gl = context.gl;
   111     var viewport = context.viewport;
   112     var shader = context.shader;
   113     var mvMatrix = context.mvMatrix;
   114     var pMatrix = context.pMatrix;
   115     var object = context.object;
   116     gl.viewport(0, 0, viewport.width, viewport.height);
   117     gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
   118     mat4.perspective(45, viewport.width / viewport.height, 0.1, 100.0, pMatrix);
   119     mat4.identity(mvMatrix);
   120     mat4.translate(mvMatrix, [0.0, 0.0, -7.0]);
   121     gl.bindBuffer(gl.ARRAY_BUFFER, object.buffer);
   122     gl.vertexAttribPointer(shader.vertexPosition, object.itemSize, gl.FLOAT, false, 0, 0); 
   123     gl.uniformMatrix4fv(shader.pMatrixUniform, false, pMatrix);
   124     gl.uniformMatrix4fv(shader.mvMatrixUniform, false, mvMatrix);
   125     //context.updateMatrixUniforms();
   126     gl.drawArrays(gl.TRIANGLE_STRIP, 0, object.numItems);
   127     return context;
   128 } 
   129 
   130 function drawScene(context) {
   131         gl.viewport(0, 0, viewport.width, viewport.height);
   132         gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
   133  
   134         mat4.perspective(45, viewport.width / viewport.height, 0.1, 100.0, pMatrix);
   135  
   136         mat4.identity(mvMatrix); 
   137         mat4.translate(mvMatrix, [0.0, 0.0, -7.0]);
   138   
   139         gl.bindBuffer(gl.ARRAY_BUFFER, object.buffer);
   140         gl.vertexAttribPointer(shader.vertexPosition, object.itemSize, gl.FLOAT, false, 0, 0);
   141         gl.uniformMatrix4fv(shader.pMatrixUniform, false, pMatrix);
   142 	gl.uniformMatrix4fv(shader.mvMatrixUniform, false, mvMatrix);
   143         gl.drawArrays(gl.TRIANGLE_STRIP, 0, object.numItems);
   144     }
   145