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