scripts/machine.js
changeset 24 8c2ee41d3727
parent 22 14e63848fc05
child 25 3b66f92dbc4d
     1.1 --- a/scripts/machine.js	Mon Apr 25 23:30:26 2011 +0200
     1.2 +++ b/scripts/machine.js	Tue Apr 26 01:48:56 2011 +0200
     1.3 @@ -10,6 +10,8 @@
     1.4  var mouseActionMap = {"pitch": [[true, false, false], pitchCamera],
     1.5  		      "yaw": [[true, false, false], yawCamera],
     1.6                        "wheel": zoomCamera};
     1.7 +include("scripts/cube.js");
     1.8 +include("scripts/renderer.js");
     1.9  
    1.10  function main()
    1.11  {
    1.12 @@ -244,58 +246,7 @@
    1.13      }
    1.14  }
    1.15  
    1.16 -function Renderer(camera, context)
    1.17 -{
    1.18 -    this.camera = camera;
    1.19 -    this.context = context;
    1.20 -    this.gl = context.gl;
    1.21 -    this.matrixStack = [];
    1.22 -}
    1.23 -Renderer.prototype.update = function(scene)
    1.24 -{ 
    1.25 -    var gl = this.context.gl;
    1.26 -    var viewport = this.context.viewport;
    1.27 -    var shader = this.context.shader;
    1.28 -    var mvMatrix = this.context.mvMatrix;
    1.29 -    var pMatrix = this.context.pMatrix;
    1.30 -    var camera = this.camera;
    1.31 -    camera.update();
    1.32  
    1.33 -    gl.viewport(0, 0, viewport.width, viewport.height);
    1.34 -    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
    1.35 -    mat4.perspective(45, viewport.width / viewport.height, 0.1, 100.0, pMatrix);
    1.36 -
    1.37 -    mat4.identity(mvMatrix);
    1.38 -    mat4.multiply(mvMatrix, camera.matrix);   
    1.39 -    
    1.40 -    //this.pushMatrix(mvMatrix);
    1.41 -
    1.42 -    gl.bindBuffer(gl.ARRAY_BUFFER, scene.positionBuffer);
    1.43 -    gl.vertexAttribPointer(shader.vertexPosition, scene.positionBuffer.itemSize, gl.FLOAT, false, 0, 0);
    1.44 -
    1.45 -    gl.bindBuffer(gl.ARRAY_BUFFER, scene.colourBuffer);
    1.46 -    gl.vertexAttribPointer(shader.vertexColour, scene.colourBuffer.itemSize, gl.FLOAT, false, 0, 0);
    1.47 -    
    1.48 -    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, scene.indexBuffer);
    1.49 -
    1.50 -    this.context.updateMatrixUniforms();
    1.51 -    gl.drawElements(gl.TRIANGLES, scene.indexBuffer.numItems, gl.UNSIGNED_SHORT, 0);
    1.52 -    //gl.drawArrays(gl.TRIANGLE_STRIP, 0, scene.positionBuffer.numItems);
    1.53 -    
    1.54 -    //mvMatrix = this.popMatrix();
    1.55 -
    1.56 -    if (this.next) this.next.draw(scene);
    1.57 -}
    1.58 -Renderer.prototype.pushMatrix = function(matrix)
    1.59 -{
    1.60 -    var copy = mat4.create();
    1.61 -    mat4.set(matrix, copy);
    1.62 -    this.matrixStack.push(copy);
    1.63 -}
    1.64 -Renderer.prototype.popMatrix = function()    
    1.65 -{
    1.66 -    if (this.matrixStack.length > 0) return this.matrixStack.pop();
    1.67 -}
    1.68  
    1.69  function Machine(scene)
    1.70  {
    1.71 @@ -312,184 +263,10 @@
    1.72      this.lastUpdate = time;
    1.73  }
    1.74  
    1.75 -function Context(canvas)
    1.76 -{
    1.77 -    this.canvas = canvas;
    1.78 -    try 
    1.79 -    {
    1.80 -	this.gl = canvas.getContext("experimental-webgl");
    1.81 -	this.viewport = {'width': canvas.width,
    1.82 -			 'height': canvas.height};
    1.83 -    } 
    1.84 -    catch(e) 
    1.85 -    {
    1.86 -	alert(e);
    1.87 -    }
    1.88 -    if (!this.gl) alert("Failed: WebGL init.");
    1.89 -    this.mvMatrix = mat4.create();
    1.90 -    this.pMatrix = mat4.create();
    1.91 -    this.shader = new Shader(this);  
    1.92 -}
    1.93 -Context.prototype.updateMatrixUniforms = function()
    1.94 -{
    1.95 -    var gl = this.gl;
    1.96 -    var program = this.shader;
    1.97 -    var pMatrix = this.pMatrix;
    1.98 -    var mvMatrix = this.mvMatrix;
    1.99 -    gl.uniformMatrix4fv(program.pMatrixUniform, false, pMatrix);
   1.100 -    gl.uniformMatrix4fv(program.mvMatrixUniform, false, mvMatrix);
   1.101 -}
   1.102 -Context.prototype.expand = function()
   1.103 -{ 
   1.104 -    var width = window.innerWidth;
   1.105 -    var height = window.innerHeight;
   1.106 -    this.canvas.width = width;
   1.107 -    this.canvas.height = height;
   1.108 -    this.viewport.width = width;
   1.109 -    this.viewport.height = height;
   1.110 -}
   1.111  
   1.112 -function Shader(context)
   1.113 -{
   1.114 -    var gl = context.gl;
   1.115 -    var fragment = loadShader(gl, "fragment-shader");
   1.116 -    var vertex = loadShader(gl, "vertex-shader");
   1.117 -    this.program = gl.createProgram();
   1.118 -    gl.attachShader(this.program, vertex);
   1.119 -    gl.attachShader(this.program, fragment);
   1.120 -    gl.linkProgram(this.program);
   1.121  
   1.122 -    if (!gl.getProgramParameter(this.program, gl.LINK_STATUS))
   1.123 -    {
   1.124 -	alert("Failed: Shader init.");
   1.125 -    }
   1.126  
   1.127 -    gl.useProgram(this.program);
   1.128 -    this.vertexPosition = gl.getAttribLocation(this.program, "aVertexPosition");
   1.129 -    gl.enableVertexAttribArray(this.vertexPosition);
   1.130 -    
   1.131 -    this.vertexColour = gl.getAttribLocation(this.program, "aVertexColour");
   1.132 -    gl.enableVertexAttribArray(this.vertexColour);
   1.133  
   1.134 -    this.pMatrixUniform = gl.getUniformLocation(this.program, "uPMatrix");
   1.135 -    this.mvMatrixUniform = gl.getUniformLocation(this.program, "uMVMatrix");
   1.136 -
   1.137 -    function loadShader(gl, id)
   1.138 -    {
   1.139 -	var script = document.getElementById(id);
   1.140 -	if (!script) return null;
   1.141 -	
   1.142 -	var str = "";
   1.143 -	var child = script.firstChild;
   1.144 -	while (child)
   1.145 -	{
   1.146 -	    if (child.nodeType == 3) str += child.textContent;
   1.147 -	    child = child.nextSibling;
   1.148 -	}
   1.149 -	
   1.150 -	var shader;
   1.151 -	var common = "x-shader/x-";
   1.152 -	if (script.type == common + "fragment") shader = gl.createShader(gl.FRAGMENT_SHADER);
   1.153 -	else if (script.type == common + "vertex") shader = gl.createShader(gl.VERTEX_SHADER);
   1.154 -	else return null;
   1.155 -
   1.156 -	gl.shaderSource(shader, str);
   1.157 -	gl.compileShader(shader);
   1.158 -
   1.159 -	if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS))
   1.160 -        {
   1.161 -	    alert(gl.getShaderInfoLog(shader));
   1.162 -	    return null;
   1.163 -	}
   1.164 -
   1.165 -	return shader;
   1.166 -    }
   1.167 -}
   1.168 -
   1.169 -
   1.170 -function Cube(size, context)
   1.171 -{
   1.172 -    var gl = context.gl;
   1.173 -    this.size = size || 1;
   1.174 -    this.rotation = {'x': 0.0, 'y': 0.0, 'z': 0.0};
   1.175 -    
   1.176 -    this.positionBuffer = gl.createBuffer();
   1.177 -    gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);
   1.178 -    var vertices = [
   1.179 -	     // Front face
   1.180 -            -1.0, -1.0,  1.0,
   1.181 -             1.0, -1.0,  1.0,
   1.182 -             1.0,  1.0,  1.0,
   1.183 -            -1.0,  1.0,  1.0,
   1.184 - 
   1.185 -            // Back face
   1.186 -            -1.0, -1.0, -1.0,
   1.187 -            -1.0,  1.0, -1.0,
   1.188 -             1.0,  1.0, -1.0,
   1.189 -             1.0, -1.0, -1.0,
   1.190 - 
   1.191 -            // Top face
   1.192 -            -1.0,  1.0, -1.0,
   1.193 -            -1.0,  1.0,  1.0,
   1.194 -             1.0,  1.0,  1.0,
   1.195 -             1.0,  1.0, -1.0,
   1.196 - 
   1.197 -            // Bottom face
   1.198 -            -1.0, -1.0, -1.0,
   1.199 -             1.0, -1.0, -1.0,
   1.200 -             1.0, -1.0,  1.0,
   1.201 -            -1.0, -1.0,  1.0,
   1.202 - 
   1.203 -            // Right face
   1.204 -             1.0, -1.0, -1.0,
   1.205 -             1.0,  1.0, -1.0,
   1.206 -             1.0,  1.0,  1.0,
   1.207 -             1.0, -1.0,  1.0,
   1.208 - 
   1.209 -            // Left face
   1.210 -            -1.0, -1.0, -1.0,
   1.211 -            -1.0, -1.0,  1.0,
   1.212 -            -1.0,  1.0,  1.0,
   1.213 -            -1.0,  1.0, -1.0];
   1.214 -    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
   1.215 -    this.positionBuffer.itemSize = 3;
   1.216 -    this.positionBuffer.numItems = 24;
   1.217 -
   1.218 -    this.colourBuffer = gl.createBuffer();
   1.219 -    gl.bindBuffer(gl.ARRAY_BUFFER, this.colourBuffer);
   1.220 -    var alpha = 1.0;
   1.221 -    var colours = [[1.0, 0.0, 0.0, alpha],
   1.222 -		   [0.0, 1.0, 0.0, alpha],
   1.223 -		   [0.0, 0.0, 1.0, alpha],
   1.224 -		   [1.0, 0.0, 1.0, alpha],
   1.225 -		   [1.0, 1.0, 0.0, alpha],
   1.226 -		   [0.0, 1.0, 1.0, alpha]];
   1.227 -    var unpackedColours = [];
   1.228 -    for (var i in colours)
   1.229 -    {
   1.230 -	var colour = colours[i];
   1.231 -	for (var j = 0; j < 4; j++)
   1.232 -	{
   1.233 -	    unpackedColours = unpackedColours.concat(colour);
   1.234 -	}
   1.235 -	//colours = colours.concat([0.5, 0.5, 1.0, 1.0]);
   1.236 -    }
   1.237 -    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(unpackedColours), gl.STATIC_DRAW);
   1.238 -    this.colourBuffer.itemSize = 4;
   1.239 -    this.colourBuffer.numItems = 24;
   1.240 -
   1.241 -    this.indexBuffer = gl.createBuffer();
   1.242 -    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);
   1.243 -    var indices = [0, 1, 2, 0, 2, 3,
   1.244 -		   4, 5, 6, 4, 6, 7,
   1.245 -		   8, 9, 10, 8, 10, 11,
   1.246 -		   12, 13, 14, 12, 14, 15,
   1.247 -		   16, 17, 18, 16, 18, 19,
   1.248 -		   20, 21, 22, 20, 22, 23];
   1.249 -    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);
   1.250 -    this.indexBuffer.itemSize = 1;
   1.251 -    this.indexBuffer.numItems = 36;
   1.252 -}
   1.253  
   1.254  function read(file, handler)
   1.255  {