scripts/machine.js
author Eugen Sawin <sawine@me73.com>
Fri, 01 Apr 2011 23:28:15 +0200
changeset 5 ac9ba687a05c
parent 4 3f61f8af55ff
child 6 cd14e5b5296c
permissions -rwxr-xr-x
Refact: Render.
sawine@2
     1
var machine;
sawine@5
     2
var render;
sawine@2
     3
sawine@2
     4
function main()
sawine@2
     5
{
sawine@2
     6
    var canvas = document.getElementById("machine");
sawine@5
     7
    window.onresize = resize;
sawine@2
     8
    var context = new Context(canvas);
sawine@3
     9
    make_fullscreen(context);
sawine@2
    10
    var gl = context.gl;
sawine@2
    11
    var object = new Box(1, context);
sawine@2
    12
    gl.clearColor(0.0, 0.0, 0.0, 1.0);
sawine@2
    13
    gl.enable(gl.DEPTH_TEST);
sawine@5
    14
    machine = new Machine(object);
sawine@5
    15
    render = new Render(context);
sawine@5
    16
    render.draw(machine.scene);
sawine@2
    17
}
sawine@2
    18
sawine@5
    19
function resize()
sawine@2
    20
{
sawine@3
    21
    make_fullscreen(machine.context);
sawine@2
    22
    machine.draw();
sawine@2
    23
}
sawine@2
    24
sawine@3
    25
function make_fullscreen(context)
sawine@2
    26
{
sawine@3
    27
    var width = window.innerWidth;
sawine@3
    28
    var height = window.innerHeight;
sawine@3
    29
    context.canvas.width = width;
sawine@3
    30
    context.canvas.height = height;
sawine@3
    31
    context.viewport.width = width;
sawine@3
    32
    context.viewport.height = height;
sawine@2
    33
}
sawine@2
    34
sawine@5
    35
function Render(context)
sawine@4
    36
{
sawine@4
    37
    this.context = context;
sawine@4
    38
    this.gl = context.gl;
sawine@4
    39
}
sawine@5
    40
Render.prototype.draw = function(scene)
sawine@5
    41
{ 
sawine@5
    42
    var gl = this.context.gl;
sawine@5
    43
    var viewport = this.context.viewport;
sawine@5
    44
    var shader = this.context.shader;
sawine@5
    45
    var mvMatrix = this.context.mvMatrix;
sawine@5
    46
    var pMatrix = this.context.pMatrix;
sawine@5
    47
sawine@5
    48
    gl.viewport(0, 0, viewport.width, viewport.height);
sawine@5
    49
    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
sawine@5
    50
    mat4.perspective(45, viewport.width / viewport.height, 0.1, 100.0, pMatrix);
sawine@5
    51
sawine@5
    52
    mat4.identity(mvMatrix);
sawine@5
    53
    mat4.translate(mvMatrix, [0.0, 0.0, -7.0]);
sawine@5
    54
    gl.bindBuffer(gl.ARRAY_BUFFER, scene.positionBuffer);
sawine@5
    55
    gl.vertexAttribPointer(shader.vertexPosition, scene.positionBuffer.itemSize, gl.FLOAT, false, 0, 0);
sawine@5
    56
sawine@5
    57
    gl.bindBuffer(gl.ARRAY_BUFFER, scene.colourBuffer);
sawine@5
    58
    gl.vertexAttribPointer(shader.vertexColour, scene.colourBuffer.itemSize, gl.FLOAT, false, 0, 0);
sawine@5
    59
sawine@5
    60
    this.context.updateMatrixUniforms();
sawine@5
    61
    gl.drawArrays(gl.TRIANGLE_STRIP, 0, scene.positionBuffer.numItems);
sawine@5
    62
sawine@5
    63
    if (this.next) this.next.draw(scene);
sawine@5
    64
}
sawine@5
    65
sawine@5
    66
function Machine(scene)
sawine@4
    67
{
sawine@5
    68
    this.scene = scene;
sawine@5
    69
}
sawine@5
    70
Machine.prototype.draw = function(render)
sawine@5
    71
{
sawine@5
    72
    render.draw(this.scene);
sawine@4
    73
}
sawine@4
    74
sawine@2
    75
function Context(canvas)
sawine@2
    76
{
sawine@3
    77
    this.canvas = canvas;
sawine@2
    78
    try 
sawine@2
    79
    {
sawine@2
    80
	this.gl = canvas.getContext("experimental-webgl");
sawine@2
    81
	this.viewport = {'width': canvas.width,
sawine@2
    82
			 'height': canvas.height};
sawine@2
    83
    } 
sawine@2
    84
    catch(e) 
sawine@2
    85
    {
sawine@2
    86
	alert(e);
sawine@2
    87
    }
sawine@2
    88
    if (!this.gl) alert("Failed: WebGL init.");
sawine@2
    89
    this.mvMatrix = mat4.create();
sawine@2
    90
    this.pMatrix = mat4.create();
sawine@2
    91
    this.shader = new Shader(this);    
sawine@2
    92
}
sawine@2
    93
Context.prototype.updateMatrixUniforms = function()
sawine@2
    94
{
sawine@2
    95
    var gl = this.gl;
sawine@2
    96
    var program = this.shader;
sawine@2
    97
    var pMatrix = this.pMatrix;
sawine@2
    98
    var mvMatrix = this.mvMatrix;
sawine@2
    99
    gl.uniformMatrix4fv(program.pMatrixUniform, false, pMatrix);
sawine@2
   100
    gl.uniformMatrix4fv(program.mvMatrixUniform, false, mvMatrix);
sawine@2
   101
}
sawine@2
   102
sawine@2
   103
function Shader(context)
sawine@2
   104
{
sawine@2
   105
    var gl = context.gl;
sawine@2
   106
    var fragment = load_shader(gl, "fragment-shader");
sawine@2
   107
    var vertex = load_shader(gl, "vertex-shader");
sawine@2
   108
    this.program = gl.createProgram();
sawine@2
   109
    gl.attachShader(this.program, vertex);
sawine@2
   110
    gl.attachShader(this.program, fragment);
sawine@2
   111
    gl.linkProgram(this.program);
sawine@2
   112
sawine@2
   113
    if (!gl.getProgramParameter(this.program, gl.LINK_STATUS))
sawine@2
   114
    {
sawine@2
   115
	alert("Failed: Shader init.");
sawine@2
   116
    }
sawine@2
   117
sawine@2
   118
    gl.useProgram(this.program);
sawine@2
   119
    this.vertexPosition = gl.getAttribLocation(this.program, "aVertexPosition");
sawine@2
   120
    gl.enableVertexAttribArray(this.vertexPosition);
sawine@4
   121
    
sawine@4
   122
    this.vertexColour = gl.getAttribLocation(this.program, "aVertexColour");
sawine@4
   123
    gl.enableVertexAttribArray(this.vertexColour);
sawine@4
   124
sawine@2
   125
    this.pMatrixUniform = gl.getUniformLocation(this.program, "uPMatrix");
sawine@2
   126
    this.mvMatrixUniform = gl.getUniformLocation(this.program, "uMVMatrix");
sawine@2
   127
sawine@2
   128
    function load_shader(gl, id)
sawine@2
   129
    {
sawine@2
   130
	var script = document.getElementById(id);
sawine@2
   131
	if (!script) return null;
sawine@2
   132
	
sawine@2
   133
	var str = "";
sawine@2
   134
	var child = script.firstChild;
sawine@2
   135
	while (child)
sawine@2
   136
	{
sawine@2
   137
	    if (child.nodeType == 3) str += child.textContent;
sawine@2
   138
	    child = child.nextSibling;
sawine@2
   139
	}
sawine@2
   140
	
sawine@2
   141
	var shader;
sawine@2
   142
	var common = "x-shader/x-";
sawine@2
   143
	if (script.type == common + "fragment") shader = gl.createShader(gl.FRAGMENT_SHADER);
sawine@2
   144
	else if (script.type == common + "vertex") shader = gl.createShader(gl.VERTEX_SHADER);
sawine@2
   145
	else return null;
sawine@2
   146
sawine@2
   147
	gl.shaderSource(shader, str);
sawine@2
   148
	gl.compileShader(shader);
sawine@2
   149
sawine@2
   150
	if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS))
sawine@2
   151
        {
sawine@2
   152
	    alert(gl.getShaderInfoLog(shader));
sawine@2
   153
	    return null;
sawine@2
   154
	}
sawine@2
   155
sawine@2
   156
	return shader;
sawine@2
   157
    }
sawine@2
   158
}
sawine@2
   159
sawine@2
   160
sawine@2
   161
function Box(size, context)
sawine@2
   162
{
sawine@2
   163
    var gl = context.gl;
sawine@2
   164
    this.size = size || 1;
sawine@4
   165
    
sawine@4
   166
    this.positionBuffer = gl.createBuffer();
sawine@4
   167
    gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);
sawine@2
   168
    var vertices = [1.0, 1.0, 0.0,
sawine@2
   169
		    -1.0, 1.0, 0.0,
sawine@2
   170
		    1.0, -1.0, 0.0,
sawine@2
   171
		    -1.0, -1.0, 0.0];
sawine@2
   172
    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
sawine@4
   173
    this.positionBuffer.itemSize = 3;
sawine@4
   174
    this.positionBuffer.numItems = 4;
sawine@4
   175
sawine@4
   176
    this.colourBuffer = gl.createBuffer();
sawine@4
   177
    gl.bindBuffer(gl.ARRAY_BUFFER, this.colourBuffer);
sawine@4
   178
    var colours = [1.0, 0.0, 0.0, .5,
sawine@4
   179
		   0.0, 1.0, 0.0, .5,
sawine@4
   180
		   0.0, 0.0, 1.0, .5,
sawine@4
   181
		   1.0, 0.0, 1.0, .5];
sawine@4
   182
    //colours = [];
sawine@4
   183
    for (var i = 0; i < 4; i++)
sawine@4
   184
    {
sawine@4
   185
	//	colours = colours.concat([0.5, 0.5, 1.0, 1.0]);
sawine@4
   186
    }
sawine@4
   187
    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colours), gl.STATIC_DRAW);
sawine@4
   188
    this.colourBuffer.itemSize = 4;
sawine@4
   189
    this.colourBuffer.numItems = 4;
sawine@2
   190
}